# domolibrary: a powerful pydomo alternative
<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->
## Formatting
use_snake_case for everything except class names is_bool - prefix any
boolean parameters with is_bool
## Patterns to recycle
### UPSERT
domolibrary.classes.DomoUser upsert_user
### search entity
user_routes.SearchUser_NoResults()
## What is it?
**domolibrary** is a Python package that provides a OOP (class-based)
and a functional approach to interacting with Domo’s API framework.
All accessed APIs are documented under DataCrew’s
<a href ="https://documenter.getpostman.com/view/5049119/UyxbppB2" target="_blank">Domo
Documentation</a> page.
This library was created by
<a href ="https://datacrew.circle.so" target = "_blank">DataCrew</a>
contributor Jae Wilson.
## Install
The DataCrew team is hard at work expanding the list of available
`classes` and `routes`. We have a ton of work completed, it’s just a
matter of migrating and documenting the code into this library.
``` sh
pip install domolibrary
```
## How to use
### Authentication
For each task, consider the appropriate
[`DomoAuth`](https://jaewilson07.github.io/domo_library/client/domoauth.html#domoauth)
mechanism. In most cases
[`DomoFullAuth`](https://jaewilson07.github.io/domo_library/client/domoauth.html#domofullauth)
or
[`DomoTokenAuth`](https://jaewilson07.github.io/domo_library/client/domoauth.html#domotokenauth)
will be appropriate as this library predominately accesses private APIs.
Any Public routes or methods will be labeled appropriately in which case
you should use
[`DomoDeveloperAuth`](https://jaewilson07.github.io/domo_library/client/domoauth.html#domodeveloperauth).
Public routes are APIs enumerated and documented under
<a href = "https://developer.domo.com/" target="_blank">Developer.Domo.com</a>.
Typically each project will begin with configuring an auth object. If
you are accessing multiple Domo instances, you’ll probably need multiple
auth objects.
``` python
# configure an auth method
import os
import domolibrary.client.DomoAuth as dmda
token_auth = dmda.DomoTokenAuth(
domo_instance=os.environ['DOMO_INSTANCE'],
domo_access_token=os.environ["DOMO_ACCESS_TOKEN"],
)
```
### Option 1: class based programming
In this project domo entities,
[`DomoActivityLog`](https://jaewilson07.github.io/domo_library/classes/domoactivitylog.html#domoactivitylog),
[`DomoDataset`](https://jaewilson07.github.io/domo_library/classes/domodataset.html#domodataset)
are all prefixed ‘Domo’ and can be found in the `classes` folder. Each
class method will call one or more `routes`. Each route will interact
with one and only one API.
Although most methods will be standard methods that will be called after
creating an instance of the class, some methods will be classmethods
which return an instance of the class.
In the example below,
[`DomoDataset.get_from_id`](https://jaewilson07.github.io/domo_library/classes/domodataset.html#domodataset.get_from_id)
is a classmethod.
Note: DomoLibrary uses the asynchronous `aiohttp` requests library to
offer users the ability to write concurrently executing code.
``` python
# import domolibrary.classes.DomoDataset as dmds
# # this is a class method
# domo_ds = await dmds.DomoDataset.get_from_id(auth=token_auth, dataset_id=os.environ['DOJO_DATASET_ID'])
# domo_ds
```
Once instantiated, you can call methods to interact with that object.
You typically won’t have to pass auth creds again because they are saved
to the object.
In the example below we are retrieving the
[`DomoDataset_Schema`](https://jaewilson07.github.io/domo_library/classes/domodataset_schema.html#domodataset_schema)
which consists of subclass
[`DomoDataset_Schema_Column`](https://jaewilson07.github.io/domo_library/classes/domodataset_schema.html#domodataset_schema_column)
using the
[`DomoDataset_Schema.get`](https://jaewilson07.github.io/domo_library/classes/domodataset_schema.html#domodataset_schema.get)
method.
We take the approach of where possible converting dictionaries from Domo
APIs into classes because it provides greater predictability when users
are creating integrations between platforms (ex. Domo to Trello).
``` python
# await domo_ds.schema.get()
```
Typically all information about an entity is saved in the object
``` python
# domo_ds.__dict__
```
### Option 2 functional programming
Although classes add a pretty wrapper for interacting with Domo APIs,
users can opt to interact directly with APIs by way of `routes`.
All route functions will exclusively call one API and will always return
a
[`ResponseGetData`](https://jaewilson07.github.io/domo_library/client/responsegetdata.html#responsegetdata)
object OR raise an `Exception` if appropriate.
For example we can implement similar functionality as the Option 1
example by calling the
[`get_dataset_by_id`](https://jaewilson07.github.io/domo_library/routes/dataset.html#get_dataset_by_id)
function.
``` python
import domolibrary.routes.dataset as dataset_routes
ds_res = await dataset_routes.get_dataset_by_id(
auth=token_auth, dataset_id=os.environ["DOJO_DATASET_ID"]
)
ds_res
```
warning this token has not been validated by who_am_i, run get_auth_token first
ResponseGetData(status=200, response={'id': '04c1574e-c8be-4721-9846-c6ffa491144b', 'displayType': 'domo-jupyterdata', 'dataProviderType': 'domo-jupyterdata', 'type': 'Jupyter', 'name': 'domo_kbs', 'owner': {'id': '1893952720', 'name': 'Jae Wilson1', 'type': 'USER', 'group': False}, 'status': 'SUCCESS', 'created': 1668379680000, 'lastTouched': 1711222468000, 'lastUpdated': 1668385822045, 'rowCount': 1185, 'columnCount': 7, 'cardInfo': {'cardCount': 2, 'cardViewCount': 0}, 'properties': {'formulas': {'formulas': {'calculation_ca9d4b1c-f73a-4f76-9f94-d3c4ca6871c5': {'templateId': 2664, 'id': 'calculation_ca9d4b1c-f73a-4f76-9f94-d3c4ca6871c5', 'name': 'rowcount', 'formula': 'sum(1)', 'status': 'VALID', 'dataType': 'LONG', 'persistedOnDataSource': True, 'isAggregatable': True, 'bignumber': False, 'variable': False}, 'calculation_38846559-d190-4ab1-809b-bcd361db5670': {'templateId': 2665, 'id': 'calculation_38846559-d190-4ab1-809b-bcd361db5670', 'name': 'max_views', 'formula': 'max(views)', 'status': 'VALID', 'dataType': 'LONG', 'persistedOnDataSource': True, 'isAggregatable': True, 'bignumber': False, 'columnPositions': [{'columnName': 'views', 'columnPosition': 4}], 'variable': False}}}}, 'state': 'SUCCESS', 'validConfiguration': True, 'validAccount': True, 'streamId': 825, 'transportType': 'API', 'adc': True, 'adcExternal': False, 'adcSource': 'DIRECT', 'cloudId': 'domo', 'cloudName': 'Domo', 'permissions': 'READ_WRITE_DELETE_SHARE_ADMIN', 'hidden': False, 'tags': '["Mar-23-2024 13:34","developer_documentation","hackercore"]', 'scheduleActive': True, 'cardCount': 2, 'cryoStatus': 'ADRENALINE', 'cloudEngine': 'domo'}, is_success=True, parent_class=None)
[`ResponseGetData`](https://jaewilson07.github.io/domo_library/client/responsegetdata.html#responsegetdata)
will always include a boolean `is_success`, the API `status`, and raw
API `response`.
Typically the route methods will not alter the response unless the API
does not include a descriptive response (ex,
`routes.dataset.set_dataset_tags` does not return a response so we
artificially alter the response in the function.)
``` python
[
(prop, type(getattr(ds_res, prop)))
for prop in dir(ds_res)
if not prop.startswith("_")
]
```
[('auth', domolibrary.client.DomoAuth.DomoTokenAuth),
('is_success', bool),
('parent_class', NoneType),
('response', dict),
('set_response', method),
('status', int),
('traceback_details', domolibrary.client.Logger.TracebackDetails)]
``` python
ds_res.response
```
{'id': '04c1574e-c8be-4721-9846-c6ffa491144b',
'displayType': 'domo-jupyterdata',
'dataProviderType': 'domo-jupyterdata',
'type': 'Jupyter',
'name': 'domo_kbs',
'owner': {'id': '1893952720',
'name': 'Jae Wilson1',
'type': 'USER',
'group': False},
'status': 'SUCCESS',
'created': 1668379680000,
'lastTouched': 1711222468000,
'lastUpdated': 1668385822045,
'rowCount': 1185,
'columnCount': 7,
'cardInfo': {'cardCount': 2, 'cardViewCount': 0},
'properties': {'formulas': {'formulas': {'calculation_ca9d4b1c-f73a-4f76-9f94-d3c4ca6871c5': {'templateId': 2664,
'id': 'calculation_ca9d4b1c-f73a-4f76-9f94-d3c4ca6871c5',
'name': 'rowcount',
'formula': 'sum(1)',
'status': 'VALID',
'dataType': 'LONG',
'persistedOnDataSource': True,
'isAggregatable': True,
'bignumber': False,
'variable': False},
'calculation_38846559-d190-4ab1-809b-bcd361db5670': {'templateId': 2665,
'id': 'calculation_38846559-d190-4ab1-809b-bcd361db5670',
'name': 'max_views',
'formula': 'max(views)',
'status': 'VALID',
'dataType': 'LONG',
'persistedOnDataSource': True,
'isAggregatable': True,
'bignumber': False,
'columnPositions': [{'columnName': 'views', 'columnPosition': 4}],
'variable': False}}}},
'state': 'SUCCESS',
'validConfiguration': True,
'validAccount': True,
'streamId': 825,
'transportType': 'API',
'adc': True,
'adcExternal': False,
'adcSource': 'DIRECT',
'cloudId': 'domo',
'cloudName': 'Domo',
'permissions': 'READ_WRITE_DELETE_SHARE_ADMIN',
'hidden': False,
'tags': '["Mar-23-2024 13:34","developer_documentation","hackercore"]',
'scheduleActive': True,
'cardCount': 2,
'cryoStatus': 'ADRENALINE',
'cloudEngine': 'domo'}
### Access Paginated APIs using the Looper
A hidden advantage of using the DomoLibrary is that paginated API
requests are baked into the route’s definition.
Consider
[`query_dataset_private`](https://jaewilson07.github.io/domo_library/routes/dataset.html#query_dataset_private)
from the `routes.dataset`.
Inside this function we are using
[`looper`](https://jaewilson07.github.io/domo_library/client/get_data.html#looper)
from `client.get_data` to paginate over the API response.
# known errors
- utils/upload_data is using a general try/except
- bootstrap route raising a general exception
- integrations/role_hierarchy raising general exception
- integrations/domoJupyter raising general exception
- DomoUser general Exception
Raw data
{
"_id": null,
"home_page": "https://github.com/jaewilson07/domo_library",
"name": "domolibrary",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "nbdev jupyter notebook python",
"author": "Jae Wilson",
"author_email": "jaewilson07@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/03/af/cd53d63a7156f04077582d31681fd77d49d84e61eff11cdfccf3f208cb2f/domolibrary-4.2.105.tar.gz",
"platform": null,
"description": "# domolibrary: a powerful pydomo alternative\n\n\n<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->\n\n## Formatting\n\nuse_snake_case for everything except class names is_bool - prefix any\nboolean parameters with is_bool\n\n## Patterns to recycle\n\n### UPSERT\n\ndomolibrary.classes.DomoUser upsert_user\n\n### search entity\n\nuser_routes.SearchUser_NoResults()\n\n## What is it?\n\n**domolibrary** is a Python package that provides a OOP (class-based)\nand a functional approach to interacting with Domo\u2019s API framework.\n\nAll accessed APIs are documented under DataCrew\u2019s\n<a href =\"https://documenter.getpostman.com/view/5049119/UyxbppB2\" target=\"_blank\">Domo\nDocumentation</a> page.\n\nThis library was created by\n<a href =\"https://datacrew.circle.so\" target = \"_blank\">DataCrew</a>\ncontributor Jae Wilson.\n\n## Install\n\nThe DataCrew team is hard at work expanding the list of available\n`classes` and `routes`. We have a ton of work completed, it\u2019s just a\nmatter of migrating and documenting the code into this library.\n\n``` sh\npip install domolibrary\n```\n\n## How to use\n\n### Authentication\n\nFor each task, consider the appropriate\n[`DomoAuth`](https://jaewilson07.github.io/domo_library/client/domoauth.html#domoauth)\nmechanism. In most cases\n[`DomoFullAuth`](https://jaewilson07.github.io/domo_library/client/domoauth.html#domofullauth)\nor\n[`DomoTokenAuth`](https://jaewilson07.github.io/domo_library/client/domoauth.html#domotokenauth)\nwill be appropriate as this library predominately accesses private APIs.\n\nAny Public routes or methods will be labeled appropriately in which case\nyou should use\n[`DomoDeveloperAuth`](https://jaewilson07.github.io/domo_library/client/domoauth.html#domodeveloperauth).\nPublic routes are APIs enumerated and documented under\n<a href = \"https://developer.domo.com/\" target=\"_blank\">Developer.Domo.com</a>.\n\nTypically each project will begin with configuring an auth object. If\nyou are accessing multiple Domo instances, you\u2019ll probably need multiple\nauth objects.\n\n``` python\n# configure an auth method\nimport os\nimport domolibrary.client.DomoAuth as dmda\n\ntoken_auth = dmda.DomoTokenAuth(\n domo_instance=os.environ['DOMO_INSTANCE'],\n domo_access_token=os.environ[\"DOMO_ACCESS_TOKEN\"],\n)\n```\n\n### Option 1: class based programming\n\nIn this project domo entities,\n[`DomoActivityLog`](https://jaewilson07.github.io/domo_library/classes/domoactivitylog.html#domoactivitylog),\n[`DomoDataset`](https://jaewilson07.github.io/domo_library/classes/domodataset.html#domodataset)\nare all prefixed \u2018Domo\u2019 and can be found in the `classes` folder. Each\nclass method will call one or more `routes`. Each route will interact\nwith one and only one API.\n\nAlthough most methods will be standard methods that will be called after\ncreating an instance of the class, some methods will be classmethods\nwhich return an instance of the class.\n\nIn the example below,\n[`DomoDataset.get_from_id`](https://jaewilson07.github.io/domo_library/classes/domodataset.html#domodataset.get_from_id)\nis a classmethod.\n\nNote: DomoLibrary uses the asynchronous `aiohttp` requests library to\noffer users the ability to write concurrently executing code.\n\n``` python\n# import domolibrary.classes.DomoDataset as dmds\n\n# # this is a class method\n# domo_ds = await dmds.DomoDataset.get_from_id(auth=token_auth, dataset_id=os.environ['DOJO_DATASET_ID'])\n# domo_ds\n```\n\nOnce instantiated, you can call methods to interact with that object.\nYou typically won\u2019t have to pass auth creds again because they are saved\nto the object.\n\nIn the example below we are retrieving the\n[`DomoDataset_Schema`](https://jaewilson07.github.io/domo_library/classes/domodataset_schema.html#domodataset_schema)\nwhich consists of subclass\n[`DomoDataset_Schema_Column`](https://jaewilson07.github.io/domo_library/classes/domodataset_schema.html#domodataset_schema_column)\nusing the\n[`DomoDataset_Schema.get`](https://jaewilson07.github.io/domo_library/classes/domodataset_schema.html#domodataset_schema.get)\nmethod.\n\nWe take the approach of where possible converting dictionaries from Domo\nAPIs into classes because it provides greater predictability when users\nare creating integrations between platforms (ex. Domo to Trello).\n\n``` python\n# await domo_ds.schema.get()\n```\n\nTypically all information about an entity is saved in the object\n\n``` python\n# domo_ds.__dict__\n```\n\n### Option 2 functional programming\n\nAlthough classes add a pretty wrapper for interacting with Domo APIs,\nusers can opt to interact directly with APIs by way of `routes`.\n\nAll route functions will exclusively call one API and will always return\na\n[`ResponseGetData`](https://jaewilson07.github.io/domo_library/client/responsegetdata.html#responsegetdata)\nobject OR raise an `Exception` if appropriate.\n\nFor example we can implement similar functionality as the Option 1\nexample by calling the\n[`get_dataset_by_id`](https://jaewilson07.github.io/domo_library/routes/dataset.html#get_dataset_by_id)\nfunction.\n\n``` python\nimport domolibrary.routes.dataset as dataset_routes\n\nds_res = await dataset_routes.get_dataset_by_id(\n auth=token_auth, dataset_id=os.environ[\"DOJO_DATASET_ID\"]\n)\nds_res\n```\n\n warning this token has not been validated by who_am_i, run get_auth_token first\n\n ResponseGetData(status=200, response={'id': '04c1574e-c8be-4721-9846-c6ffa491144b', 'displayType': 'domo-jupyterdata', 'dataProviderType': 'domo-jupyterdata', 'type': 'Jupyter', 'name': 'domo_kbs', 'owner': {'id': '1893952720', 'name': 'Jae Wilson1', 'type': 'USER', 'group': False}, 'status': 'SUCCESS', 'created': 1668379680000, 'lastTouched': 1711222468000, 'lastUpdated': 1668385822045, 'rowCount': 1185, 'columnCount': 7, 'cardInfo': {'cardCount': 2, 'cardViewCount': 0}, 'properties': {'formulas': {'formulas': {'calculation_ca9d4b1c-f73a-4f76-9f94-d3c4ca6871c5': {'templateId': 2664, 'id': 'calculation_ca9d4b1c-f73a-4f76-9f94-d3c4ca6871c5', 'name': 'rowcount', 'formula': 'sum(1)', 'status': 'VALID', 'dataType': 'LONG', 'persistedOnDataSource': True, 'isAggregatable': True, 'bignumber': False, 'variable': False}, 'calculation_38846559-d190-4ab1-809b-bcd361db5670': {'templateId': 2665, 'id': 'calculation_38846559-d190-4ab1-809b-bcd361db5670', 'name': 'max_views', 'formula': 'max(views)', 'status': 'VALID', 'dataType': 'LONG', 'persistedOnDataSource': True, 'isAggregatable': True, 'bignumber': False, 'columnPositions': [{'columnName': 'views', 'columnPosition': 4}], 'variable': False}}}}, 'state': 'SUCCESS', 'validConfiguration': True, 'validAccount': True, 'streamId': 825, 'transportType': 'API', 'adc': True, 'adcExternal': False, 'adcSource': 'DIRECT', 'cloudId': 'domo', 'cloudName': 'Domo', 'permissions': 'READ_WRITE_DELETE_SHARE_ADMIN', 'hidden': False, 'tags': '[\"Mar-23-2024 13:34\",\"developer_documentation\",\"hackercore\"]', 'scheduleActive': True, 'cardCount': 2, 'cryoStatus': 'ADRENALINE', 'cloudEngine': 'domo'}, is_success=True, parent_class=None)\n\n[`ResponseGetData`](https://jaewilson07.github.io/domo_library/client/responsegetdata.html#responsegetdata)\nwill always include a boolean `is_success`, the API `status`, and raw\nAPI `response`.\n\nTypically the route methods will not alter the response unless the API\ndoes not include a descriptive response (ex,\n`routes.dataset.set_dataset_tags` does not return a response so we\nartificially alter the response in the function.)\n\n``` python\n[\n (prop, type(getattr(ds_res, prop)))\n for prop in dir(ds_res)\n if not prop.startswith(\"_\")\n]\n```\n\n [('auth', domolibrary.client.DomoAuth.DomoTokenAuth),\n ('is_success', bool),\n ('parent_class', NoneType),\n ('response', dict),\n ('set_response', method),\n ('status', int),\n ('traceback_details', domolibrary.client.Logger.TracebackDetails)]\n\n``` python\nds_res.response\n```\n\n {'id': '04c1574e-c8be-4721-9846-c6ffa491144b',\n 'displayType': 'domo-jupyterdata',\n 'dataProviderType': 'domo-jupyterdata',\n 'type': 'Jupyter',\n 'name': 'domo_kbs',\n 'owner': {'id': '1893952720',\n 'name': 'Jae Wilson1',\n 'type': 'USER',\n 'group': False},\n 'status': 'SUCCESS',\n 'created': 1668379680000,\n 'lastTouched': 1711222468000,\n 'lastUpdated': 1668385822045,\n 'rowCount': 1185,\n 'columnCount': 7,\n 'cardInfo': {'cardCount': 2, 'cardViewCount': 0},\n 'properties': {'formulas': {'formulas': {'calculation_ca9d4b1c-f73a-4f76-9f94-d3c4ca6871c5': {'templateId': 2664,\n 'id': 'calculation_ca9d4b1c-f73a-4f76-9f94-d3c4ca6871c5',\n 'name': 'rowcount',\n 'formula': 'sum(1)',\n 'status': 'VALID',\n 'dataType': 'LONG',\n 'persistedOnDataSource': True,\n 'isAggregatable': True,\n 'bignumber': False,\n 'variable': False},\n 'calculation_38846559-d190-4ab1-809b-bcd361db5670': {'templateId': 2665,\n 'id': 'calculation_38846559-d190-4ab1-809b-bcd361db5670',\n 'name': 'max_views',\n 'formula': 'max(views)',\n 'status': 'VALID',\n 'dataType': 'LONG',\n 'persistedOnDataSource': True,\n 'isAggregatable': True,\n 'bignumber': False,\n 'columnPositions': [{'columnName': 'views', 'columnPosition': 4}],\n 'variable': False}}}},\n 'state': 'SUCCESS',\n 'validConfiguration': True,\n 'validAccount': True,\n 'streamId': 825,\n 'transportType': 'API',\n 'adc': True,\n 'adcExternal': False,\n 'adcSource': 'DIRECT',\n 'cloudId': 'domo',\n 'cloudName': 'Domo',\n 'permissions': 'READ_WRITE_DELETE_SHARE_ADMIN',\n 'hidden': False,\n 'tags': '[\"Mar-23-2024 13:34\",\"developer_documentation\",\"hackercore\"]',\n 'scheduleActive': True,\n 'cardCount': 2,\n 'cryoStatus': 'ADRENALINE',\n 'cloudEngine': 'domo'}\n\n### Access Paginated APIs using the Looper\n\nA hidden advantage of using the DomoLibrary is that paginated API\nrequests are baked into the route\u2019s definition.\n\nConsider\n[`query_dataset_private`](https://jaewilson07.github.io/domo_library/routes/dataset.html#query_dataset_private)\nfrom the `routes.dataset`.\n\nInside this function we are using\n[`looper`](https://jaewilson07.github.io/domo_library/client/get_data.html#looper)\nfrom `client.get_data` to paginate over the API response.\n\n# known errors\n\n- utils/upload_data is using a general try/except\n- bootstrap route raising a general exception\n- integrations/role_hierarchy raising general exception\n- integrations/domoJupyter raising general exception\n- DomoUser general Exception\n",
"bugtrack_url": null,
"license": "Apache Software License 2.0",
"summary": null,
"version": "4.2.105",
"project_urls": {
"Homepage": "https://github.com/jaewilson07/domo_library"
},
"split_keywords": [
"nbdev",
"jupyter",
"notebook",
"python"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "4f9e38126d1616e9706882ec2efa63f0077dc66852329e33c614a1f28058c9bf",
"md5": "3371fcbd1ef5382d9d8beddab4fdd368",
"sha256": "444e116662c3e8da6caf068ef2a661afaaee39f1b336050d9a4fbe33bbbeb5bf"
},
"downloads": -1,
"filename": "domolibrary-4.2.105-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3371fcbd1ef5382d9d8beddab4fdd368",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 241585,
"upload_time": "2024-12-16T22:35:15",
"upload_time_iso_8601": "2024-12-16T22:35:15.679775Z",
"url": "https://files.pythonhosted.org/packages/4f/9e/38126d1616e9706882ec2efa63f0077dc66852329e33c614a1f28058c9bf/domolibrary-4.2.105-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "03afcd53d63a7156f04077582d31681fd77d49d84e61eff11cdfccf3f208cb2f",
"md5": "eeb0c59b8c5df8761e369b45fb73509c",
"sha256": "e7bc1838f293fb860298d5681d3d2f1358a3aa698a09432e0ada8abc4bcfbde3"
},
"downloads": -1,
"filename": "domolibrary-4.2.105.tar.gz",
"has_sig": false,
"md5_digest": "eeb0c59b8c5df8761e369b45fb73509c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 186538,
"upload_time": "2024-12-16T22:35:17",
"upload_time_iso_8601": "2024-12-16T22:35:17.703635Z",
"url": "https://files.pythonhosted.org/packages/03/af/cd53d63a7156f04077582d31681fd77d49d84e61eff11cdfccf3f208cb2f/domolibrary-4.2.105.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-16 22:35:17",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jaewilson07",
"github_project": "domo_library",
"github_not_found": true,
"lcname": "domolibrary"
}