quartic-sdk


Namequartic-sdk JSON
Version 3.1.0 PyPI version JSON
download
home_pagehttps://github.com/Quarticai/QuarticSDK/
SummaryQuarticSDK is the SDK package which exposes the APIs to the user
upload_time2024-04-24 07:11:26
maintainerNone
docs_urlNone
authorQuartic.ai engineering team
requires_pythonNone
licenseMIT
keywords quartic quarticsdk
VCS
bugtrack_url
requirements aiogqlc aiohttp aiosignal alabaster aloe ansicolors apeye apeye-core astroid asttokens async-timeout attrs autodocsumm babel beautifulsoup4 cachecontrol cachetools certifi charset-normalizer click cloudpickle colorama coloredlogs comm cssutils cycler debugpy decorator dict2css docutils domdf-python-tools entrypoints exceptiongroup executing frozenlist future gherkin-official google-auth html5lib humanfriendly idna imagesize importlib-metadata iniconfig ipykernel ipynbname ipython jedi jinja2 joblib jupyter-client jupyter-core lazy-object-proxy livereload lockfile lunr markupsafe matplotlib-inline msgpack multidict natsort nest-asyncio nltk nose numpy packaging pandas parso pexpect pillow platformdirs pluggy prompt-toolkit psutil ptyprocess pure-eval py py4j pyasn1 pyasn1-modules pygments pyparsing pytest python-dateutil pytz pyyaml pyzmq regex requests rsa ruamel-yaml ruamel-yaml-clib six snowballstemmer soupsieve sphinx sphinx-autoapi sphinx-autodoc-typehints sphinx-jinja2-compat sphinx-prompt sphinx-tabs sphinx-toolbox sphinxcontrib-applehelp sphinxcontrib-devhelp sphinxcontrib-htmlhelp sphinxcontrib-jsmath sphinxcontrib-qthelp sphinxcontrib-serializinghtml stack-data tabulate tensorflow-io-gcs-filesystem toml tornado tqdm traitlets typed-ast typing-extensions unidecode urllib3 validators wcwidth webencodings wrapt yarl zipp
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # QuarticSDK

> Quartic SDK is Quartic.ai's external software development kit which allows users to use assets, tags, and other intelligence outside the Quartic AI Platform. Using the Quartic SDK, third party developers who have access to the Quartic AI Platform can build custom applications.

[![Documentation Status](https://readthedocs.org/projects/quarticsdk/badge/?version=stable)](https://quarticsdk.readthedocs.io/en/stable/?badge=stable)

## Installation
---
Install using `pip`

```
pip install quartic-sdk
```
to Install complete package with all supported model libraries:
```
pip install quartic-sdk[complete]
```

...or follow the following steps to install it from the source:
```
git clone https://github.com/Quarticai/QuarticSDK/
python setup.py install
```

## Example
---
Comprehensive documentation is available at https://quarticsdk.readthedocs.io/en/latest/

Here's an example on how the Quartic SDK can be used:

#### Getting the assets, tags, batches from the server
```python
# Assuming that the Quartic.ai server is hosted at `https://test.quartic.ai/`, 
# with the login credentials as username and password is "testuser" and `testpassword respectively, 
# then use APIClient in the following format.

from quartic_sdk import APIClient
client = APIClient("https://test.quartic.ai/", username="testuser", password="testpassword")
user_assets = client.assets() # Get the list of all assets that the user has access to

asset = user_assets.get("name","Test Asset") # Get a specific asset with the name "Test Asset"
asset_tags = asset.get_tags() # Gets the list of all tags

first_tag=asset_tags.first() # Returns the first in the list of tags
tag_data = first_tag.data(start_time=1000000,stop_time=2000000) # Returns the downsampled data present in the first tag for the time range of 1000000 to 2000000 in wide data format.
```
```python
# For getting raw data we need to use freeflowpaginated query using Graphql Client
# Below is the example for the same
# Assuming that the Quartic.ai server is hosted at `https://test.quartic.ai/`, 
# with the login credentials as username and password is "testuser" and `testpassword respectively, 
# then use GraphqlClient in the following format.

from quartic_sdk import GraphqlClient

client = GraphqlClient(url='https://test.quartic.ai/', username='testuser', password='testpassword')

# Executing Query by:

query='''
query MyQuery($offset_map: CustomDict, $startTime: String!, $stopTime: String!, $tags: [Int]!, $limit: Int) 
{
  freeflowPaginated (startTime: $startTime, stopTime: $stopTime, tags: $tags, limit: $limit, offsetMap: $offset_map ) 
}
'''
# The varaibles passsed are as follows:
# tags (required) : This is list of ids in int datatype
# startTime (required) : startTime in epoch but in string format
# stopTime (required) : stopTime in epoch but in string format
# limit (optional) : limit the datapoints of query. defaults to 1500
# offset_map (optional) : Dictionary where key is tag_id and value is the next offset returned by query executed.

variables={
  "tags": [
    21295
  ],
  "startTime": "1706693453221",
  "stopTime": "1706697053222",
  "limit": 2,
  "offset_map": {}
}

result = client.execute_query(query=query, variables=variables)

#You should see the following result:

{
  "data": {
    "freeflowPaginated": {
      "data": {
        "21295": {
          "data": [
            [
              1706693453500,
              808
            ],
            [
              1706693454000,
              809
            ]
          ]
        }
      },
      "offset_map":{"21295":4}
      "status": 200
    }
  }
}

#using the offset in result you can create the next offset in following way and recall the execute query function
variables = {
  "tags": [
    21295
  ],
  "startTime": "1706693453221",
  "stopTime": "1706697053222",
  "limit": 2,
  "offset_map": offset_map
}

result = client.execute_query(query=query,variables=variables)

#You should see the following result:

{
  "data": {
    "freeflowPaginated": {
      "data": {
        "21295": {
          "data": [
            [
              1706693454500,
              810
            ],
            [
              1706693455000,
              811
            ]
          ]
        }
      },
      "offset_map":{"21295":6}
      "status": 200
    }
  }
}

```

```python

# If jwt auth expires the above code will throw Permission Error

# Another way to handle this is using retry mechanism which on permission error will handle the recreation of client.
# It is mentioned as below

from quartic_sdk import APIClient

retry_count = 2  # Number of times to retry the code
retry_delay = 5  # Delay in seconds between retries

while retry_count > 0:
    try:
        client = APIClient("https://test.quartic.ai/", username="testuser", password="testpassword")
        user_assets = client.assets()  # Get the list of all assets that the user has access to

        asset = user_assets.get("name", "Test Asset")  # Get a specific asset with the name "Test Asset"
        asset_tags = asset.get_tags()  # Gets the list of all tags

        first_tag = asset_tags.first()  # Returns the first in the list of tags
        tag_data = first_tag.data(start_time=1000000,
                                  stop_time=2000000)  # Returns the data present in the first tag for the time range of 1000000 to 2000000

        # If the code reaches here without exceptions, break out of the loop
        break
    except PermissionError:
        # If the refresh token expires, this error is thrown and recreation of client is needed to update the tokens
        retry_count -= 1
        if retry_count > 0:
            print(f"PermissionError: Retrying in {retry_delay} seconds...")
            time.sleep(retry_delay)
        else:
            # If still the error persist, the password might have been changed
            print("PermissionError: Maximum retries reached. Exiting.")
            break

```

```python

# Assuming that the Quartic.ai server is hosted at `https://test.quartic.ai/`, 
# with the login credentials as username and password is "testuser" and `testpassword respectively, 
# then use GraphqlClient in the following format.

from quartic_sdk import GraphqlClient

client = GraphqlClient(url='https://test.quartic.ai/', username='testuser', password='testpassword')

# Executing Query by:

query='''
query MyQuery {
  Site {
    id
    name
  }
}
'''

result = client.execute_query(query=query)

# To execute query asynchronously use the function below.

#You should see the following result:

{'data': {'Site': [{'id': '1', 'name': 'quartic'}, {'id': '8', 'name': 'ABC site 1'}, {'id': '12', 'name': 'XYZ 123'}]}

async def execute_graphql_query():
    query='''
        query MyQuery {
          Site {
            id
            name
          }
        }
        '''
    resp = await client.execute_async_query(query=query)
    return resp

# Note: The above function will return a coroutine object.

# Example to upload a file.

query = '''
    mutation($file: Upload!, $edge_connector: Int!, $date_format: DateTime!) {
        uploadTelemetryCsv(
            file: $file,
            fileName: "123",
            edgeConnector: $edge_connector,
            dateFormat: $date_format
            )
            {
            taskId
            status
        }
    }
'''


variables = {
    'file': open('<path/to/file>', 'rb'),
    'edge_connector': 'edgeConnector Id',
    'date_format': 'DatTime format'
}

response = client.execute_query(query=query, variables=variables)


```



## Documentation
---
To run the documentation locally, run the following commands in terminal:
```
cd docs
make html

cd docs/source
sphinx-build -b html . _build
open build/html/index.html
```

## Test Cases
---
To run the behaviour test cases, run the command:
```
aloe
```
To run the unit test cases, run the command:
```
pytest
```



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Quarticai/QuarticSDK/",
    "name": "quartic-sdk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "Quartic, QuarticSDK",
    "author": "Quartic.ai engineering team",
    "author_email": "tech@quartic.ai",
    "download_url": "https://files.pythonhosted.org/packages/30/ae/290345cc373aba1b5b1d8a12285ba5720b2858cc2c459496a31daf6dfa02/quartic-sdk-3.1.0.tar.gz",
    "platform": null,
    "description": "# QuarticSDK\n\n> Quartic SDK is Quartic.ai's external software development kit which allows users to use assets, tags, and other intelligence outside the Quartic AI Platform. Using the Quartic SDK, third party developers who have access to the Quartic AI Platform can build custom applications.\n\n[![Documentation Status](https://readthedocs.org/projects/quarticsdk/badge/?version=stable)](https://quarticsdk.readthedocs.io/en/stable/?badge=stable)\n\n## Installation\n---\nInstall using `pip`\n\n```\npip install quartic-sdk\n```\nto Install complete package with all supported model libraries:\n```\npip install quartic-sdk[complete]\n```\n\n...or follow the following steps to install it from the source:\n```\ngit clone https://github.com/Quarticai/QuarticSDK/\npython setup.py install\n```\n\n## Example\n---\nComprehensive documentation is available at https://quarticsdk.readthedocs.io/en/latest/\n\nHere's an example on how the Quartic SDK can be used:\n\n#### Getting the assets, tags, batches from the server\n```python\n# Assuming that the Quartic.ai server is hosted at `https://test.quartic.ai/`, \n# with the login credentials as username and password is \"testuser\" and `testpassword respectively, \n# then use APIClient in the following format.\n\nfrom quartic_sdk import APIClient\nclient = APIClient(\"https://test.quartic.ai/\", username=\"testuser\", password=\"testpassword\")\nuser_assets = client.assets() # Get the list of all assets that the user has access to\n\nasset = user_assets.get(\"name\",\"Test Asset\") # Get a specific asset with the name \"Test Asset\"\nasset_tags = asset.get_tags() # Gets the list of all tags\n\nfirst_tag=asset_tags.first() # Returns the first in the list of tags\ntag_data = first_tag.data(start_time=1000000,stop_time=2000000) # Returns the downsampled data present in the first tag for the time range of 1000000 to 2000000 in wide data format.\n```\n```python\n# For getting raw data we need to use freeflowpaginated query using Graphql Client\n# Below is the example for the same\n# Assuming that the Quartic.ai server is hosted at `https://test.quartic.ai/`, \n# with the login credentials as username and password is \"testuser\" and `testpassword respectively, \n# then use GraphqlClient in the following format.\n\nfrom quartic_sdk import GraphqlClient\n\nclient = GraphqlClient(url='https://test.quartic.ai/', username='testuser', password='testpassword')\n\n# Executing Query by:\n\nquery='''\nquery MyQuery($offset_map: CustomDict, $startTime: String!, $stopTime: String!, $tags: [Int]!, $limit: Int) \n{\n  freeflowPaginated (startTime: $startTime, stopTime: $stopTime, tags: $tags, limit: $limit, offsetMap: $offset_map ) \n}\n'''\n# The varaibles passsed are as follows:\n# tags (required) : This is list of ids in int datatype\n# startTime (required) : startTime in epoch but in string format\n# stopTime (required) : stopTime in epoch but in string format\n# limit (optional) : limit the datapoints of query. defaults to 1500\n# offset_map (optional) : Dictionary where key is tag_id and value is the next offset returned by query executed.\n\nvariables={\n  \"tags\": [\n    21295\n  ],\n  \"startTime\": \"1706693453221\",\n  \"stopTime\": \"1706697053222\",\n  \"limit\": 2,\n  \"offset_map\": {}\n}\n\nresult = client.execute_query(query=query, variables=variables)\n\n#You should see the following result:\n\n{\n  \"data\": {\n    \"freeflowPaginated\": {\n      \"data\": {\n        \"21295\": {\n          \"data\": [\n            [\n              1706693453500,\n              808\n            ],\n            [\n              1706693454000,\n              809\n            ]\n          ]\n        }\n      },\n      \"offset_map\":{\"21295\":4}\n      \"status\": 200\n    }\n  }\n}\n\n#using the offset in result you can create the next offset in following way and recall the execute query function\nvariables = {\n  \"tags\": [\n    21295\n  ],\n  \"startTime\": \"1706693453221\",\n  \"stopTime\": \"1706697053222\",\n  \"limit\": 2,\n  \"offset_map\": offset_map\n}\n\nresult = client.execute_query(query=query,variables=variables)\n\n#You should see the following result:\n\n{\n  \"data\": {\n    \"freeflowPaginated\": {\n      \"data\": {\n        \"21295\": {\n          \"data\": [\n            [\n              1706693454500,\n              810\n            ],\n            [\n              1706693455000,\n              811\n            ]\n          ]\n        }\n      },\n      \"offset_map\":{\"21295\":6}\n      \"status\": 200\n    }\n  }\n}\n\n```\n\n```python\n\n# If jwt auth expires the above code will throw Permission Error\n\n# Another way to handle this is using retry mechanism which on permission error will handle the recreation of client.\n# It is mentioned as below\n\nfrom quartic_sdk import APIClient\n\nretry_count = 2  # Number of times to retry the code\nretry_delay = 5  # Delay in seconds between retries\n\nwhile retry_count > 0:\n    try:\n        client = APIClient(\"https://test.quartic.ai/\", username=\"testuser\", password=\"testpassword\")\n        user_assets = client.assets()  # Get the list of all assets that the user has access to\n\n        asset = user_assets.get(\"name\", \"Test Asset\")  # Get a specific asset with the name \"Test Asset\"\n        asset_tags = asset.get_tags()  # Gets the list of all tags\n\n        first_tag = asset_tags.first()  # Returns the first in the list of tags\n        tag_data = first_tag.data(start_time=1000000,\n                                  stop_time=2000000)  # Returns the data present in the first tag for the time range of 1000000 to 2000000\n\n        # If the code reaches here without exceptions, break out of the loop\n        break\n    except PermissionError:\n        # If the refresh token expires, this error is thrown and recreation of client is needed to update the tokens\n        retry_count -= 1\n        if retry_count > 0:\n            print(f\"PermissionError: Retrying in {retry_delay} seconds...\")\n            time.sleep(retry_delay)\n        else:\n            # If still the error persist, the password might have been changed\n            print(\"PermissionError: Maximum retries reached. Exiting.\")\n            break\n\n```\n\n```python\n\n# Assuming that the Quartic.ai server is hosted at `https://test.quartic.ai/`, \n# with the login credentials as username and password is \"testuser\" and `testpassword respectively, \n# then use GraphqlClient in the following format.\n\nfrom quartic_sdk import GraphqlClient\n\nclient = GraphqlClient(url='https://test.quartic.ai/', username='testuser', password='testpassword')\n\n# Executing Query by:\n\nquery='''\nquery MyQuery {\n  Site {\n    id\n    name\n  }\n}\n'''\n\nresult = client.execute_query(query=query)\n\n# To execute query asynchronously use the function below.\n\n#You should see the following result:\n\n{'data': {'Site': [{'id': '1', 'name': 'quartic'}, {'id': '8', 'name': 'ABC site 1'}, {'id': '12', 'name': 'XYZ 123'}]}\n\nasync def execute_graphql_query():\n    query='''\n        query MyQuery {\n          Site {\n            id\n            name\n          }\n        }\n        '''\n    resp = await client.execute_async_query(query=query)\n    return resp\n\n# Note: The above function will return a coroutine object.\n\n# Example to upload a file.\n\nquery = '''\n    mutation($file: Upload!, $edge_connector: Int!, $date_format: DateTime!) {\n        uploadTelemetryCsv(\n            file: $file,\n            fileName: \"123\",\n            edgeConnector: $edge_connector,\n            dateFormat: $date_format\n            )\n            {\n            taskId\n            status\n        }\n    }\n'''\n\n\nvariables = {\n    'file': open('<path/to/file>', 'rb'),\n    'edge_connector': 'edgeConnector Id',\n    'date_format': 'DatTime format'\n}\n\nresponse = client.execute_query(query=query, variables=variables)\n\n\n```\n\n\n\n## Documentation\n---\nTo run the documentation locally, run the following commands in terminal:\n```\ncd docs\nmake html\n\ncd docs/source\nsphinx-build -b html . _build\nopen build/html/index.html\n```\n\n## Test Cases\n---\nTo run the behaviour test cases, run the command:\n```\naloe\n```\nTo run the unit test cases, run the command:\n```\npytest\n```\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "QuarticSDK is the SDK package which exposes the APIs to the user",
    "version": "3.1.0",
    "project_urls": {
        "Homepage": "https://github.com/Quarticai/QuarticSDK/"
    },
    "split_keywords": [
        "quartic",
        " quarticsdk"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2ec3734f17fa589d208762d88f3c60fcaaacc5d135b1661fd1fcab5a1be68b2d",
                "md5": "ec0fbb468829b4e801d183d7df70df45",
                "sha256": "7a708f5030bb2a8bbb3736a330b53f7bee9c4b092a8a5ce7530042ff850391e7"
            },
            "downloads": -1,
            "filename": "quartic_sdk-3.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ec0fbb468829b4e801d183d7df70df45",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 55997,
            "upload_time": "2024-04-24T07:11:24",
            "upload_time_iso_8601": "2024-04-24T07:11:24.607951Z",
            "url": "https://files.pythonhosted.org/packages/2e/c3/734f17fa589d208762d88f3c60fcaaacc5d135b1661fd1fcab5a1be68b2d/quartic_sdk-3.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "30ae290345cc373aba1b5b1d8a12285ba5720b2858cc2c459496a31daf6dfa02",
                "md5": "85a69be8d2a21d8ca6c7dd943d1d235d",
                "sha256": "91d33be9bc83c34f2bbd4670414ea2b87b4e044bd5f857f124c8ee57dbad4831"
            },
            "downloads": -1,
            "filename": "quartic-sdk-3.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "85a69be8d2a21d8ca6c7dd943d1d235d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 37560,
            "upload_time": "2024-04-24T07:11:26",
            "upload_time_iso_8601": "2024-04-24T07:11:26.968583Z",
            "url": "https://files.pythonhosted.org/packages/30/ae/290345cc373aba1b5b1d8a12285ba5720b2858cc2c459496a31daf6dfa02/quartic-sdk-3.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-24 07:11:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Quarticai",
    "github_project": "QuarticSDK",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "aiogqlc",
            "specs": [
                [
                    "==",
                    "2.2.0"
                ]
            ]
        },
        {
            "name": "aiohttp",
            "specs": [
                [
                    "==",
                    "3.8.1"
                ]
            ]
        },
        {
            "name": "aiosignal",
            "specs": [
                [
                    "==",
                    "1.3.1"
                ]
            ]
        },
        {
            "name": "alabaster",
            "specs": [
                [
                    "==",
                    "0.7.16"
                ]
            ]
        },
        {
            "name": "aloe",
            "specs": [
                [
                    "==",
                    "0.2.0"
                ]
            ]
        },
        {
            "name": "ansicolors",
            "specs": [
                [
                    "==",
                    "1.1.8"
                ]
            ]
        },
        {
            "name": "apeye",
            "specs": [
                [
                    "==",
                    "1.4.1"
                ]
            ]
        },
        {
            "name": "apeye-core",
            "specs": [
                [
                    "==",
                    "1.1.5"
                ]
            ]
        },
        {
            "name": "astroid",
            "specs": [
                [
                    "==",
                    "2.5.1"
                ]
            ]
        },
        {
            "name": "asttokens",
            "specs": [
                [
                    "==",
                    "2.4.1"
                ]
            ]
        },
        {
            "name": "async-timeout",
            "specs": [
                [
                    "==",
                    "4.0.2"
                ]
            ]
        },
        {
            "name": "attrs",
            "specs": [
                [
                    "==",
                    "22.2.0"
                ]
            ]
        },
        {
            "name": "autodocsumm",
            "specs": [
                [
                    "==",
                    "0.2.12"
                ]
            ]
        },
        {
            "name": "babel",
            "specs": [
                [
                    "==",
                    "2.10.3"
                ]
            ]
        },
        {
            "name": "beautifulsoup4",
            "specs": [
                [
                    "==",
                    "4.12.3"
                ]
            ]
        },
        {
            "name": "cachecontrol",
            "specs": [
                [
                    "==",
                    "0.12.6"
                ]
            ]
        },
        {
            "name": "cachetools",
            "specs": [
                [
                    "==",
                    "5.2.0"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2022.12.7"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "2.0.12"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    "==",
                    "8.0.3"
                ]
            ]
        },
        {
            "name": "cloudpickle",
            "specs": [
                [
                    "==",
                    "1.6.0"
                ]
            ]
        },
        {
            "name": "colorama",
            "specs": [
                [
                    "==",
                    "0.4.6"
                ]
            ]
        },
        {
            "name": "coloredlogs",
            "specs": [
                [
                    "==",
                    "15.0.1"
                ]
            ]
        },
        {
            "name": "comm",
            "specs": [
                [
                    "==",
                    "0.2.2"
                ]
            ]
        },
        {
            "name": "cssutils",
            "specs": [
                [
                    "==",
                    "2.6.0"
                ]
            ]
        },
        {
            "name": "cycler",
            "specs": [
                [
                    "==",
                    "0.12.1"
                ]
            ]
        },
        {
            "name": "debugpy",
            "specs": [
                [
                    "==",
                    "1.8.1"
                ]
            ]
        },
        {
            "name": "decorator",
            "specs": [
                [
                    "==",
                    "5.1.1"
                ]
            ]
        },
        {
            "name": "dict2css",
            "specs": [
                [
                    "==",
                    "0.3.0.post1"
                ]
            ]
        },
        {
            "name": "docutils",
            "specs": [
                [
                    "==",
                    "0.17.1"
                ]
            ]
        },
        {
            "name": "domdf-python-tools",
            "specs": [
                [
                    "==",
                    "3.7.0"
                ]
            ]
        },
        {
            "name": "entrypoints",
            "specs": [
                [
                    "==",
                    "0.4"
                ]
            ]
        },
        {
            "name": "exceptiongroup",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "executing",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "frozenlist",
            "specs": [
                [
                    "==",
                    "1.3.3"
                ]
            ]
        },
        {
            "name": "future",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "gherkin-official",
            "specs": [
                [
                    "==",
                    "4.1.3"
                ]
            ]
        },
        {
            "name": "google-auth",
            "specs": [
                [
                    "==",
                    "2.15.0"
                ]
            ]
        },
        {
            "name": "html5lib",
            "specs": [
                [
                    "==",
                    "1.1"
                ]
            ]
        },
        {
            "name": "humanfriendly",
            "specs": [
                [
                    "==",
                    "10.0"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.4"
                ]
            ]
        },
        {
            "name": "imagesize",
            "specs": [
                [
                    "==",
                    "1.4.1"
                ]
            ]
        },
        {
            "name": "importlib-metadata",
            "specs": [
                [
                    "==",
                    "7.0.1"
                ]
            ]
        },
        {
            "name": "iniconfig",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "ipykernel",
            "specs": [
                [
                    "==",
                    "6.25.2"
                ]
            ]
        },
        {
            "name": "ipynbname",
            "specs": [
                [
                    "==",
                    "2023.2.0.0"
                ]
            ]
        },
        {
            "name": "ipython",
            "specs": [
                [
                    "==",
                    "8.18.1"
                ]
            ]
        },
        {
            "name": "jedi",
            "specs": [
                [
                    "==",
                    "0.19.1"
                ]
            ]
        },
        {
            "name": "jinja2",
            "specs": [
                [
                    "==",
                    "3.0.3"
                ]
            ]
        },
        {
            "name": "joblib",
            "specs": [
                [
                    "==",
                    "1.3.2"
                ]
            ]
        },
        {
            "name": "jupyter-client",
            "specs": [
                [
                    "==",
                    "7.2.0"
                ]
            ]
        },
        {
            "name": "jupyter-core",
            "specs": [
                [
                    "==",
                    "5.7.2"
                ]
            ]
        },
        {
            "name": "lazy-object-proxy",
            "specs": [
                [
                    "==",
                    "1.10.0"
                ]
            ]
        },
        {
            "name": "livereload",
            "specs": [
                [
                    "==",
                    "2.6.3"
                ]
            ]
        },
        {
            "name": "lockfile",
            "specs": [
                [
                    "==",
                    "0.12.2"
                ]
            ]
        },
        {
            "name": "lunr",
            "specs": [
                [
                    "==",
                    "0.5.8"
                ]
            ]
        },
        {
            "name": "markupsafe",
            "specs": [
                [
                    "==",
                    "2.1.1"
                ]
            ]
        },
        {
            "name": "matplotlib-inline",
            "specs": [
                [
                    "==",
                    "0.1.6"
                ]
            ]
        },
        {
            "name": "msgpack",
            "specs": [
                [
                    "==",
                    "1.0.2"
                ]
            ]
        },
        {
            "name": "multidict",
            "specs": [
                [
                    "==",
                    "6.0.3"
                ]
            ]
        },
        {
            "name": "natsort",
            "specs": [
                [
                    "==",
                    "8.4.0"
                ]
            ]
        },
        {
            "name": "nest-asyncio",
            "specs": [
                [
                    "==",
                    "1.5.4"
                ]
            ]
        },
        {
            "name": "nltk",
            "specs": [
                [
                    "==",
                    "3.6.6"
                ]
            ]
        },
        {
            "name": "nose",
            "specs": [
                [
                    "==",
                    "1.3.7"
                ]
            ]
        },
        {
            "name": "numpy",
            "specs": [
                [
                    "==",
                    "1.22.0"
                ]
            ]
        },
        {
            "name": "packaging",
            "specs": [
                [
                    "==",
                    "20.9"
                ]
            ]
        },
        {
            "name": "pandas",
            "specs": [
                [
                    "==",
                    "1.3.0"
                ]
            ]
        },
        {
            "name": "parso",
            "specs": [
                [
                    "==",
                    "0.8.3"
                ]
            ]
        },
        {
            "name": "pexpect",
            "specs": [
                [
                    "==",
                    "4.8.0"
                ]
            ]
        },
        {
            "name": "pillow",
            "specs": [
                [
                    "==",
                    "9.0.1"
                ]
            ]
        },
        {
            "name": "platformdirs",
            "specs": [
                [
                    "==",
                    "3.7.0"
                ]
            ]
        },
        {
            "name": "pluggy",
            "specs": [
                [
                    "==",
                    "0.13.1"
                ]
            ]
        },
        {
            "name": "prompt-toolkit",
            "specs": [
                [
                    "==",
                    "3.0.43"
                ]
            ]
        },
        {
            "name": "psutil",
            "specs": [
                [
                    "==",
                    "5.9.4"
                ]
            ]
        },
        {
            "name": "ptyprocess",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "pure-eval",
            "specs": [
                [
                    "==",
                    "0.2.2"
                ]
            ]
        },
        {
            "name": "py",
            "specs": [
                [
                    "==",
                    "1.11.0"
                ]
            ]
        },
        {
            "name": "py4j",
            "specs": [
                [
                    "==",
                    "0.10.9.7"
                ]
            ]
        },
        {
            "name": "pyasn1",
            "specs": [
                [
                    "==",
                    "0.4.8"
                ]
            ]
        },
        {
            "name": "pyasn1-modules",
            "specs": [
                [
                    "==",
                    "0.2.8"
                ]
            ]
        },
        {
            "name": "pygments",
            "specs": [
                [
                    "==",
                    "2.17.2"
                ]
            ]
        },
        {
            "name": "pyparsing",
            "specs": [
                [
                    "==",
                    "2.4.7"
                ]
            ]
        },
        {
            "name": "pytest",
            "specs": [
                [
                    "==",
                    "6.2.2"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    "==",
                    "2.8.2"
                ]
            ]
        },
        {
            "name": "pytz",
            "specs": [
                [
                    "==",
                    "2022.7.1"
                ]
            ]
        },
        {
            "name": "pyyaml",
            "specs": [
                [
                    "==",
                    "5.4.1"
                ]
            ]
        },
        {
            "name": "pyzmq",
            "specs": [
                [
                    "==",
                    "22.0.2"
                ]
            ]
        },
        {
            "name": "regex",
            "specs": [
                [
                    "==",
                    "2023.12.25"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.26.0"
                ]
            ]
        },
        {
            "name": "rsa",
            "specs": [
                [
                    "==",
                    "4.9"
                ]
            ]
        },
        {
            "name": "ruamel-yaml",
            "specs": [
                [
                    "==",
                    "0.17.22"
                ]
            ]
        },
        {
            "name": "ruamel-yaml-clib",
            "specs": [
                [
                    "==",
                    "0.2.8"
                ]
            ]
        },
        {
            "name": "six",
            "specs": [
                [
                    "==",
                    "1.15.0"
                ]
            ]
        },
        {
            "name": "snowballstemmer",
            "specs": [
                [
                    "==",
                    "2.2.0"
                ]
            ]
        },
        {
            "name": "soupsieve",
            "specs": [
                [
                    "==",
                    "2.4.1"
                ]
            ]
        },
        {
            "name": "sphinx",
            "specs": [
                [
                    "==",
                    "3.5.1"
                ]
            ]
        },
        {
            "name": "sphinx-autoapi",
            "specs": [
                [
                    "==",
                    "1.7.0"
                ]
            ]
        },
        {
            "name": "sphinx-autodoc-typehints",
            "specs": [
                [
                    "==",
                    "1.11.1"
                ]
            ]
        },
        {
            "name": "sphinx-jinja2-compat",
            "specs": [
                [
                    "==",
                    "0.2.0"
                ]
            ]
        },
        {
            "name": "sphinx-prompt",
            "specs": [
                [
                    "==",
                    "1.1.0"
                ]
            ]
        },
        {
            "name": "sphinx-tabs",
            "specs": [
                [
                    "==",
                    "3.3.1"
                ]
            ]
        },
        {
            "name": "sphinx-toolbox",
            "specs": [
                [
                    "==",
                    "3.0.0"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-applehelp",
            "specs": [
                [
                    "==",
                    "1.0.4"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-devhelp",
            "specs": [
                [
                    "==",
                    "1.0.2"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-htmlhelp",
            "specs": [
                [
                    "==",
                    "2.0.1"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-jsmath",
            "specs": [
                [
                    "==",
                    "1.0.1"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-qthelp",
            "specs": [
                [
                    "==",
                    "1.0.3"
                ]
            ]
        },
        {
            "name": "sphinxcontrib-serializinghtml",
            "specs": [
                [
                    "==",
                    "1.1.5"
                ]
            ]
        },
        {
            "name": "stack-data",
            "specs": [
                [
                    "==",
                    "0.6.3"
                ]
            ]
        },
        {
            "name": "tabulate",
            "specs": [
                [
                    "==",
                    "0.9.0"
                ]
            ]
        },
        {
            "name": "tensorflow-io-gcs-filesystem",
            "specs": [
                [
                    "==",
                    "0.32.0"
                ]
            ]
        },
        {
            "name": "toml",
            "specs": [
                [
                    "==",
                    "0.10.2"
                ]
            ]
        },
        {
            "name": "tornado",
            "specs": [
                [
                    "==",
                    "6.1"
                ]
            ]
        },
        {
            "name": "tqdm",
            "specs": [
                [
                    "==",
                    "4.66.2"
                ]
            ]
        },
        {
            "name": "traitlets",
            "specs": [
                [
                    "==",
                    "5.14.2"
                ]
            ]
        },
        {
            "name": "typed-ast",
            "specs": [
                [
                    "==",
                    "1.4.2"
                ]
            ]
        },
        {
            "name": "typing-extensions",
            "specs": [
                [
                    "==",
                    "4.6.0"
                ]
            ]
        },
        {
            "name": "unidecode",
            "specs": [
                [
                    "==",
                    "1.3.8"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "1.26.6"
                ]
            ]
        },
        {
            "name": "validators",
            "specs": [
                [
                    "==",
                    "0.18.2"
                ]
            ]
        },
        {
            "name": "wcwidth",
            "specs": [
                [
                    "==",
                    "0.2.13"
                ]
            ]
        },
        {
            "name": "webencodings",
            "specs": [
                [
                    "==",
                    "0.5.1"
                ]
            ]
        },
        {
            "name": "wrapt",
            "specs": [
                [
                    "==",
                    "1.12.1"
                ]
            ]
        },
        {
            "name": "yarl",
            "specs": [
                [
                    "==",
                    "1.8.2"
                ]
            ]
        },
        {
            "name": "zipp",
            "specs": [
                [
                    "==",
                    "3.17.0"
                ]
            ]
        }
    ],
    "lcname": "quartic-sdk"
}
        
Elapsed time: 0.23767s