[![PyPI - License](https://img.shields.io/pypi/l/autotwin_pmswsgi)](https://github.com/AutotwinEU/proc-mining-serv/blob/main/LICENSE)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/autotwin_pmswsgi)](https://www.python.org/downloads/)
[![PyPI - Version](https://img.shields.io/pypi/v/autotwin_pmswsgi)](https://pypi.org/project/autotwin_pmswsgi/)
# Processing Mining Service (PMS) WSGI for Auto-Twin
The processing mining service (PMS) WSGI implements a RESTful API that invokes
different system discovery modules to automatically create, update and delete
graph models, Petri nets and automata in a system knowledge graph (SKG).
## Installation
To facilitate installation, the PMS WSGI is released as a Python module,
`autotwin_pmswsgi`, in the PyPI repository. `autotwin_pmswsgi` implicitly
depends on `pygraphviz`. This dependency however cannot be resolved
automatically by `pip`. As a preparation, you need to install `pygraphviz`
manually, following instructions provided
[here](https://pygraphviz.github.io/documentation/stable/install.html).
Whenever `pygraphviz` is available, the latest version of `autotwin_pmswsgi`
can be easily installed with `pip`.
pip install autotwin_pmswsgi
## Deployment
The PMS WSGI is almost ready to be deployed for production use once
`autotwin_pmswsgi` is installed successfully. Four environment variables are
additionally required to specify the [Neo4j](https://github.com/neo4j/neo4j)
instance that holds the SKG of the system under consideration.
| Name | Description |
|------------------|----------------------------------------------------------|
| `NEO4J_URI` | URI of the Neo4j instance, e.g. `neo4j://localhost:7687` |
| `NEO4J_USERNAME` | Username for the Neo4j instance, e.g. `neo4j` |
| `NEO4J_PASSWORD` | Password for the Neo4j instance, e.g. `12345678` |
| `NEO4J_DATABASE` | Database where the SKG is stored, e.g. `neo4j` |
After setting the above environment variables, you can start up the PMS WSGI on
a [Waitress](https://github.com/Pylons/waitress) server by executing
waitress-serve autotwin_pmswsgi:wsgi
## Containerization
To enable containerization, the PMS WSGI is also released as a Docker image,
`ghcr.io/autotwineu/proc-mining-serv`, in the GHCR registry. Suppose that a
Docker engine is running on your machine. Deploying the PMS WSGI on a Docker
container named `proc-mining-serv` can be done via a single command.
docker run --detach --env NEO4J_URI=<NEO4J_URI> --env NEO4J_USERNAME=<NEO4J_USERNAME> --env NEO4J_PASSWORD=<NEO4J_PASSWORD> --env NEO4J_DATABASE=<NEO4J_DATABASE> --name proc-mining-serv --pull always ghcr.io/autotwineu/proc-mining-serv
`<NEO4J_URI>`, `<NEO4J_USERNAME>`, `<NEO4J_PASSWORD>` and `<NEO4J_DATABASE>`
correspond to the values of the four environment variables required by the PMS
WSGI (see [Deployment](#deployment)).
## RESTful API
The PMS WSGI listens HTTP requests on port `8080` and is accessible through a
RESTful API that exposes the following endpoints for different types of models.
The content types of the request and response for each API endpoint are both
`application/json`.
--------------------------------------------------------------------------------
### API Endpoints for Graph Models
<details>
<summary>
<code>POST</code>
<code><b>/graph-model</b></code>
<code>(create a graph model in the SKG)</code>
</summary>
<br/>
**Parameters**
> None
**Body**
> Definition
>
> | Name | Type | Default | Description |
> |----------------------------|-------------------------|-------------------------------------------|-------------------------------------------------------------------|
> | `name` | `string` | `"System"` | Name of the system to be discovered |
> | `version` | `string` | `""` | Version of the system to be discovered |
> | `neo4j:filters:interval` | `array[number\|string]` | `[0.0, 0.0]` | Interval during which events are selected |
> | `neo4j:filters:station` | `array[string]` | `[]`<sup id="gm-mk-1">[*](#gm-fn-1)</sup> | Set of stations at which events are selected |
> | `neo4j:filters:family` | `array[string]` | `[]`<sup>[*](#gm-fn-1)</sup> | Set of families for which events are selected |
> | `neo4j:filters:type` | `array[string]` | `[]`<sup>[*](#gm-fn-1)</sup> | Set of types for which events are selected |
> | `model:time_unit` | `string` | `"s"` | Unified time unit of algorithm and model parameters |
> | `model:operation:io_ratio` | `number` | `1.5` | Minimum ratio of input to output for an ATTACH/COMPOSE operation |
> | `model:operation:co_ratio` | `number` | `0.5` | Minimum ratio of cross to output for an ATTACH/ORDINARY operation |
> | `model:operation:oi_ratio` | `number` | `1.5` | Minimum ratio of output to input for a DETACH/DECOMPOSE operation |
> | `model:operation:ci_ratio` | `number` | `0.5` | Minimum ratio of cross to input for a DETACH/ORDINARY operation |
> | `model:formula:ratio` | `number` | `0.0` | Minimum ratio of a formula to the primary one |
> | `model:delays:seize` | `number\|string` | `0.0` | Maximum delay in seizing a queued part |
> | `model:delays:release` | `number\|string` | `0.0` | Maximum delay in releasing a blocked part |
> | `model:cdf:points` | `number` | `100` | Maximum number of points in a CDF |
>
> <sup id="gm-fn-1">* An empty array refers to the universe of stations/families/types. [↩](#gm-mk-1)</sup>
> Example
> ```json
> {
> "name": "Pizza Line",
> "version": "V4",
> "neo4j": {
> "filters": {
> "interval": [
> 0,
> 500000000
> ],
> "station": [],
> "family": [],
> "type": []
> }
> },
> "model": {
> "time_unit": "ms",
> "operation": {
> "io_ratio": 1.5,
> "co_ratio": 0.5,
> "oi_ratio": 1.5,
> "ci_ratio": 0.5
> },
> "formula": {
> "ratio": 0.06
> },
> "delays": {
> "seize": 30000,
> "release": 0
> },
> "cdf": {
> "points": 100
> }
> }
> }
> ```
**Response**
> Code: 201
> Definition
>
> | Name | Type | Description |
> |------------|----------|---------------------------------|
> | `model_id` | `string` | ID of the generated graph model |
> Example
> ```json
> {
> "model_id": "4:31f61bae-dad6-4cda-bb63-d4700847dea5:620887"
> }
> ```
</details>
--------------------------------------------------------------------------------
### API Endpoints for Petri Nets
<details>
<summary>
<code>POST</code>
<code><b>/petri-net</b></code>
<code>(create a Petri net in the SKG)</code>
</summary>
<br/>
**Parameters**
> None
**Body**
> Definition
>
> | Name | Type | Default | Description |
> |----------------------------|-------------------------|-------------------------------------------|-------------------------------------------------------------------|
> | `name` | `string` | `"System"` | Name of the system to be discovered |
> | `version` | `string` | `""` | Version of the system to be discovered |
> | `neo4j:filters:interval` | `array[number\|string]` | `[0.0, 0.0]` | Interval during which events are selected |
> | `neo4j:filters:station` | `array[string]` | `[]`<sup id="pn-mk-1">[*](#pn-fn-1)</sup> | Set of stations at which events are selected |
> | `neo4j:filters:family` | `array[string]` | `[]`<sup>[*](#pn-fn-1)</sup> | Set of families for which events are selected |
> | `neo4j:filters:type` | `array[string]` | `[]`<sup>[*](#pn-fn-1)</sup> | Set of types for which events are selected |
> | `model:operation:io_ratio` | `number` | `1.5` | Minimum ratio of input to output for an ATTACH/COMPOSE operation |
> | `model:operation:co_ratio` | `number` | `0.5` | Minimum ratio of cross to output for an ATTACH/ORDINARY operation |
> | `model:operation:oi_ratio` | `number` | `1.5` | Minimum ratio of output to input for a DETACH/DECOMPOSE operation |
> | `model:operation:ci_ratio` | `number` | `0.5` | Minimum ratio of cross to input for a DETACH/ORDINARY operation |
> | `model:formula:ratio` | `number` | `0.0` | Minimum ratio of a formula to the primary one |
>
> <sup id="pn-fn-1">* An empty array refers to the universe of stations/families/types. [↩](#pn-mk-1)</sup>
> Example
> ```json
> {
> "name": "Pizza Line",
> "version": "V4",
> "neo4j": {
> "filters": {
> "interval": [
> 0,
> 500000000
> ],
> "station": [],
> "family": [],
> "type": []
> }
> },
> "model": {
> "operation": {
> "io_ratio": 1.5,
> "co_ratio": 0.5,
> "oi_ratio": 1.5,
> "ci_ratio": 0.5
> },
> "formula": {
> "ratio": 0.06
> }
> }
> }
> ```
**Response**
> Code: 201
> Definition
>
> | Name | Type | Description |
> |------------|----------|-------------------------------|
> | `model_id` | `string` | ID of the generated Petri net |
> Example
> ```json
> {
> "model_id": "4:31f61bae-dad6-4cda-bb63-d4700847dea5:620887"
> }
> ```
</details>
--------------------------------------------------------------------------------
### API Endpoints for Automata
<details>
<summary>
<code>POST</code>
<code><b>/automaton</b></code>
<code>(create an automaton in the SKG)</code>
</summary>
<br/>
**Parameters**
> None
**Body**
> Definition
>
> | Name | Type | Default | Description |
> |--------------------------|-------------------------|--------------|-------------------------------------------|
> | `name` | `string` | `"System"` | Name of the system to be discovered |
> | `version` | `string` | `""` | Version of the system to be discovered |
> | `neo4j:filters:interval` | `array[number\|string]` | `[0.0, 0.0]` | Interval during which events are selected |
> | `model:pov` | `string` | `"item"` | Point of view to be focused on |
> Example
> ```json
> {
> "name": "Pizza Line",
> "version": "V4",
> "neo4j": {
> "filters": {
> "interval": [
> 0,
> 500000000
> ]
> }
> },
> "model": {
> "pov": "item"
> }
> }
> ```
**Response**
> Code: 201
> Definition
>
> | Name | Type | Description |
> |------------|----------|-------------------------------|
> | `model_id` | `string` | ID of the generated automaton |
> Example
> ```json
> {
> "model_id": "4:31f61bae-dad6-4cda-bb63-d4700847dea5:620887"
> }
> ```
</details>
--------------------------------------------------------------------------------
Raw data
{
"_id": null,
"home_page": "https://github.com/AutotwinEU/proc-mining-serv",
"name": "autotwin_pmswsgi",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.10",
"maintainer_email": null,
"keywords": "auto-twin, system discovery, restful service",
"author": "Lulai Zhu",
"author_email": "lulai.zhu@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/4b/96/e4630562f06248e91c72b6b2e088c46ea6cb3333815229f5b6d92c595b8c/autotwin_pmswsgi-0.1.9.tar.gz",
"platform": null,
"description": "[![PyPI - License](https://img.shields.io/pypi/l/autotwin_pmswsgi)](https://github.com/AutotwinEU/proc-mining-serv/blob/main/LICENSE)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/autotwin_pmswsgi)](https://www.python.org/downloads/)\n[![PyPI - Version](https://img.shields.io/pypi/v/autotwin_pmswsgi)](https://pypi.org/project/autotwin_pmswsgi/)\n\n# Processing Mining Service (PMS) WSGI for Auto-Twin\n\nThe processing mining service (PMS) WSGI implements a RESTful API that invokes\ndifferent system discovery modules to automatically create, update and delete\ngraph models, Petri nets and automata in a system knowledge graph (SKG).\n\n## Installation\nTo facilitate installation, the PMS WSGI is released as a Python module,\n`autotwin_pmswsgi`, in the PyPI repository. `autotwin_pmswsgi` implicitly\ndepends on `pygraphviz`. This dependency however cannot be resolved\nautomatically by `pip`. As a preparation, you need to install `pygraphviz`\nmanually, following instructions provided\n[here](https://pygraphviz.github.io/documentation/stable/install.html).\nWhenever `pygraphviz` is available, the latest version of `autotwin_pmswsgi`\ncan be easily installed with `pip`.\n\n pip install autotwin_pmswsgi\n\n## Deployment\nThe PMS WSGI is almost ready to be deployed for production use once\n`autotwin_pmswsgi` is installed successfully. Four environment variables are\nadditionally required to specify the [Neo4j](https://github.com/neo4j/neo4j)\ninstance that holds the SKG of the system under consideration.\n\n| Name | Description |\n|------------------|----------------------------------------------------------|\n| `NEO4J_URI` | URI of the Neo4j instance, e.g. `neo4j://localhost:7687` |\n| `NEO4J_USERNAME` | Username for the Neo4j instance, e.g. `neo4j` |\n| `NEO4J_PASSWORD` | Password for the Neo4j instance, e.g. `12345678` |\n| `NEO4J_DATABASE` | Database where the SKG is stored, e.g. `neo4j` |\n\nAfter setting the above environment variables, you can start up the PMS WSGI on\na [Waitress](https://github.com/Pylons/waitress) server by executing\n\n waitress-serve autotwin_pmswsgi:wsgi\n\n## Containerization\nTo enable containerization, the PMS WSGI is also released as a Docker image,\n`ghcr.io/autotwineu/proc-mining-serv`, in the GHCR registry. Suppose that a\nDocker engine is running on your machine. Deploying the PMS WSGI on a Docker\ncontainer named `proc-mining-serv` can be done via a single command.\n\n docker run --detach --env NEO4J_URI=<NEO4J_URI> --env NEO4J_USERNAME=<NEO4J_USERNAME> --env NEO4J_PASSWORD=<NEO4J_PASSWORD> --env NEO4J_DATABASE=<NEO4J_DATABASE> --name proc-mining-serv --pull always ghcr.io/autotwineu/proc-mining-serv\n\n`<NEO4J_URI>`, `<NEO4J_USERNAME>`, `<NEO4J_PASSWORD>` and `<NEO4J_DATABASE>`\ncorrespond to the values of the four environment variables required by the PMS\nWSGI (see [Deployment](#deployment)).\n\n## RESTful API\nThe PMS WSGI listens HTTP requests on port `8080` and is accessible through a\nRESTful API that exposes the following endpoints for different types of models.\nThe content types of the request and response for each API endpoint are both\n`application/json`.\n\n--------------------------------------------------------------------------------\n\n### API Endpoints for Graph Models\n\n<details>\n <summary>\n <code>POST</code>\n <code><b>/graph-model</b></code>\n <code>(create a graph model in the SKG)</code>\n </summary>\n <br/>\n\n**Parameters**\n> None\n\n**Body**\n> Definition\n>\n> | Name | Type | Default | Description |\n> |----------------------------|-------------------------|-------------------------------------------|-------------------------------------------------------------------|\n> | `name` | `string` | `\"System\"` | Name of the system to be discovered |\n> | `version` | `string` | `\"\"` | Version of the system to be discovered |\n> | `neo4j:filters:interval` | `array[number\\|string]` | `[0.0, 0.0]` | Interval during which events are selected |\n> | `neo4j:filters:station` | `array[string]` | `[]`<sup id=\"gm-mk-1\">[*](#gm-fn-1)</sup> | Set of stations at which events are selected |\n> | `neo4j:filters:family` | `array[string]` | `[]`<sup>[*](#gm-fn-1)</sup> | Set of families for which events are selected |\n> | `neo4j:filters:type` | `array[string]` | `[]`<sup>[*](#gm-fn-1)</sup> | Set of types for which events are selected |\n> | `model:time_unit` | `string` | `\"s\"` | Unified time unit of algorithm and model parameters |\n> | `model:operation:io_ratio` | `number` | `1.5` | Minimum ratio of input to output for an ATTACH/COMPOSE operation |\n> | `model:operation:co_ratio` | `number` | `0.5` | Minimum ratio of cross to output for an ATTACH/ORDINARY operation |\n> | `model:operation:oi_ratio` | `number` | `1.5` | Minimum ratio of output to input for a DETACH/DECOMPOSE operation |\n> | `model:operation:ci_ratio` | `number` | `0.5` | Minimum ratio of cross to input for a DETACH/ORDINARY operation |\n> | `model:formula:ratio` | `number` | `0.0` | Minimum ratio of a formula to the primary one |\n> | `model:delays:seize` | `number\\|string` | `0.0` | Maximum delay in seizing a queued part |\n> | `model:delays:release` | `number\\|string` | `0.0` | Maximum delay in releasing a blocked part |\n> | `model:cdf:points` | `number` | `100` | Maximum number of points in a CDF |\n>\n> <sup id=\"gm-fn-1\">* An empty array refers to the universe of stations/families/types. [\u21a9](#gm-mk-1)</sup>\n\n> Example\n> ```json\n> {\n> \"name\": \"Pizza Line\",\n> \"version\": \"V4\",\n> \"neo4j\": {\n> \"filters\": {\n> \"interval\": [\n> 0,\n> 500000000\n> ],\n> \"station\": [],\n> \"family\": [],\n> \"type\": []\n> }\n> },\n> \"model\": {\n> \"time_unit\": \"ms\",\n> \"operation\": {\n> \"io_ratio\": 1.5,\n> \"co_ratio\": 0.5,\n> \"oi_ratio\": 1.5,\n> \"ci_ratio\": 0.5\n> },\n> \"formula\": {\n> \"ratio\": 0.06\n> },\n> \"delays\": {\n> \"seize\": 30000,\n> \"release\": 0\n> },\n> \"cdf\": {\n> \"points\": 100\n> }\n> }\n> }\n> ```\n\n**Response**\n> Code: 201\n\n> Definition\n> \n> | Name | Type | Description |\n> |------------|----------|---------------------------------|\n> | `model_id` | `string` | ID of the generated graph model |\n\n> Example\n> ```json\n> {\n> \"model_id\": \"4:31f61bae-dad6-4cda-bb63-d4700847dea5:620887\"\n> }\n> ```\n\n</details>\n\n--------------------------------------------------------------------------------\n\n### API Endpoints for Petri Nets\n\n<details>\n <summary>\n <code>POST</code>\n <code><b>/petri-net</b></code>\n <code>(create a Petri net in the SKG)</code>\n </summary>\n <br/>\n\n**Parameters**\n> None\n\n**Body**\n> Definition\n>\n> | Name | Type | Default | Description |\n> |----------------------------|-------------------------|-------------------------------------------|-------------------------------------------------------------------|\n> | `name` | `string` | `\"System\"` | Name of the system to be discovered |\n> | `version` | `string` | `\"\"` | Version of the system to be discovered |\n> | `neo4j:filters:interval` | `array[number\\|string]` | `[0.0, 0.0]` | Interval during which events are selected |\n> | `neo4j:filters:station` | `array[string]` | `[]`<sup id=\"pn-mk-1\">[*](#pn-fn-1)</sup> | Set of stations at which events are selected |\n> | `neo4j:filters:family` | `array[string]` | `[]`<sup>[*](#pn-fn-1)</sup> | Set of families for which events are selected |\n> | `neo4j:filters:type` | `array[string]` | `[]`<sup>[*](#pn-fn-1)</sup> | Set of types for which events are selected |\n> | `model:operation:io_ratio` | `number` | `1.5` | Minimum ratio of input to output for an ATTACH/COMPOSE operation |\n> | `model:operation:co_ratio` | `number` | `0.5` | Minimum ratio of cross to output for an ATTACH/ORDINARY operation |\n> | `model:operation:oi_ratio` | `number` | `1.5` | Minimum ratio of output to input for a DETACH/DECOMPOSE operation |\n> | `model:operation:ci_ratio` | `number` | `0.5` | Minimum ratio of cross to input for a DETACH/ORDINARY operation |\n> | `model:formula:ratio` | `number` | `0.0` | Minimum ratio of a formula to the primary one |\n>\n> <sup id=\"pn-fn-1\">* An empty array refers to the universe of stations/families/types. [\u21a9](#pn-mk-1)</sup>\n\n> Example\n> ```json\n> {\n> \"name\": \"Pizza Line\",\n> \"version\": \"V4\",\n> \"neo4j\": {\n> \"filters\": {\n> \"interval\": [\n> 0,\n> 500000000\n> ],\n> \"station\": [],\n> \"family\": [],\n> \"type\": []\n> }\n> },\n> \"model\": {\n> \"operation\": {\n> \"io_ratio\": 1.5,\n> \"co_ratio\": 0.5,\n> \"oi_ratio\": 1.5,\n> \"ci_ratio\": 0.5\n> },\n> \"formula\": {\n> \"ratio\": 0.06\n> }\n> }\n> }\n> ```\n\n**Response**\n> Code: 201\n\n> Definition\n> \n> | Name | Type | Description |\n> |------------|----------|-------------------------------|\n> | `model_id` | `string` | ID of the generated Petri net |\n\n> Example\n> ```json\n> {\n> \"model_id\": \"4:31f61bae-dad6-4cda-bb63-d4700847dea5:620887\"\n> }\n> ```\n\n</details>\n\n--------------------------------------------------------------------------------\n\n### API Endpoints for Automata\n\n<details>\n <summary>\n <code>POST</code>\n <code><b>/automaton</b></code>\n <code>(create an automaton in the SKG)</code>\n </summary>\n <br/>\n\n**Parameters**\n> None\n\n**Body**\n> Definition\n>\n> | Name | Type | Default | Description |\n> |--------------------------|-------------------------|--------------|-------------------------------------------|\n> | `name` | `string` | `\"System\"` | Name of the system to be discovered |\n> | `version` | `string` | `\"\"` | Version of the system to be discovered |\n> | `neo4j:filters:interval` | `array[number\\|string]` | `[0.0, 0.0]` | Interval during which events are selected |\n> | `model:pov` | `string` | `\"item\"` | Point of view to be focused on |\n\n> Example\n> ```json\n> {\n> \"name\": \"Pizza Line\",\n> \"version\": \"V4\",\n> \"neo4j\": {\n> \"filters\": {\n> \"interval\": [\n> 0,\n> 500000000\n> ]\n> }\n> },\n> \"model\": {\n> \"pov\": \"item\"\n> }\n> }\n> ```\n\n**Response**\n> Code: 201\n\n> Definition\n> \n> | Name | Type | Description |\n> |------------|----------|-------------------------------|\n> | `model_id` | `string` | ID of the generated automaton |\n\n> Example\n> ```json\n> {\n> \"model_id\": \"4:31f61bae-dad6-4cda-bb63-d4700847dea5:620887\"\n> }\n> ```\n\n</details>\n\n--------------------------------------------------------------------------------\n",
"bugtrack_url": null,
"license": "BSD-3-Clause",
"summary": "Process Mining Service WSGI for Auto-Twin",
"version": "0.1.9",
"project_urls": {
"Homepage": "https://github.com/AutotwinEU/proc-mining-serv"
},
"split_keywords": [
"auto-twin",
" system discovery",
" restful service"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8a6b924a62aac885210df8633558195ca2556c7104eff320bdc220f6eb3219e4",
"md5": "848531e67248f30eedcee3aba7df304a",
"sha256": "713ce8556505432f3f5c35d420870234dd483d50030d2c3b2360264e99ad9461"
},
"downloads": -1,
"filename": "autotwin_pmswsgi-0.1.9-py3-none-any.whl",
"has_sig": false,
"md5_digest": "848531e67248f30eedcee3aba7df304a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.10",
"size": 6337,
"upload_time": "2024-12-26T22:56:13",
"upload_time_iso_8601": "2024-12-26T22:56:13.954092Z",
"url": "https://files.pythonhosted.org/packages/8a/6b/924a62aac885210df8633558195ca2556c7104eff320bdc220f6eb3219e4/autotwin_pmswsgi-0.1.9-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4b96e4630562f06248e91c72b6b2e088c46ea6cb3333815229f5b6d92c595b8c",
"md5": "a00692d4bad0b5aac29a11f2d422c9f1",
"sha256": "e0ae37c05868b395213418ac4af11bd45b303d09506fef63d230849e8f500ce6"
},
"downloads": -1,
"filename": "autotwin_pmswsgi-0.1.9.tar.gz",
"has_sig": false,
"md5_digest": "a00692d4bad0b5aac29a11f2d422c9f1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.10",
"size": 6457,
"upload_time": "2024-12-26T22:56:16",
"upload_time_iso_8601": "2024-12-26T22:56:16.018241Z",
"url": "https://files.pythonhosted.org/packages/4b/96/e4630562f06248e91c72b6b2e088c46ea6cb3333815229f5b6d92c595b8c/autotwin_pmswsgi-0.1.9.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-26 22:56:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "AutotwinEU",
"github_project": "proc-mining-serv",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "autotwin_pmswsgi"
}