Skip to main content

domolibrary: a powerful pydomo alternative

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 Domo Documentation page.

This library was created by DataCrew 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.

pip install domolibrary

How to use

Authentication

For each task, consider the appropriate DomoAuth mechanism. In most cases DomoFullAuth or 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. Public routes are APIs enumerated and documented under Developer.Domo.com.

Typically each project will begin with configuring an auth object. If you are accessing multiple Domo instances, you’ll probably need multiple auth objects.

# 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, 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_by_id is a classmethod.

Note: DomoLibrary uses the asynchronous aiohttp requests library to offer users the ability to write concurrently executing code.

# import domolibrary.classes.DomoDataset as dmds

# # this is a class method
# domo_ds = await dmds.DomoDataset.get_by_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 which consists of subclass DomoDataset_Schema_Column using the 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).

# await domo_ds.schema.get()

Typically all information about an entity is saved in the object

# 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 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 function.

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 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.)

[
    (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)]
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 from the routes.dataset.

Inside this function we are using 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

Release files for domolibrary 4.5.28

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for domolibrary 4.5.28
File Size Uploaded
domolibrary-4.5.28.tar.gz 214.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for domolibrary 4.5.28
File Interpreter ABI Platform
domolibrary-4.5.28-py3-none-any.whl Python 3 none any Details

Total release size: 494.1 kB

Release files / domolibrary-4.5.28.tar.gz

Download URL domolibrary-4.5.28.tar.gz
Size 214.0 kB
Tags Source
SHA-256 checksum
How to use checksums
3736483ed7e7732d9a8463f9ea42f956eec20e1e24b66e034c8d97a1b3219aa5
BLAKE2b-256 checksum
How to use checksums
332a0f84cb1c35116c1247de866b3d2a794a69e35fa32d4b50fd776d815f7c2f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.1

Release files / domolibrary-4.5.28-py3-none-any.whl

Download URL domolibrary-4.5.28-py3-none-any.whl
Size 280.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6d5df9805ad6da92df9ff555f803b54c006baa4d72cbecc4d5760036ec5b2bd0
BLAKE2b-256 checksum
How to use checksums
4579bbaad6f8ede50ef4ac911d31c622ebf8477ae96160010bae09ad227b2077
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.1

Release history Release notifications | RSS feed

This release

4.5.28 This release

2 release files

4.5.26

2 release files

4.5.24

2 release files

4.5.23

2 release files

4.5.22

2 release files

4.5.21

2 release files

4.5.20

2 release files

4.5.17

2 release files

4.5.14

2 release files

4.5.13

2 release files

4.5.12

2 release files

4.5.11

2 release files

4.5.10

2 release files

4.5.9

2 release files

4.5.8

2 release files

4.5.6

2 release files

4.5.5

2 release files

4.5.4

2 release files

4.5.3

2 release files

4.5.2

2 release files

4.5.1

2 release files

4.5.0

2 release files

4.4.42

2 release files

4.4.41

2 release files

4.4.40

2 release files

4.4.39

2 release files

4.4.38

2 release files

4.4.37

2 release files

4.4.36

2 release files

4.4.35

2 release files

4.4.34

2 release files

4.4.33

2 release files

4.4.32

2 release files

4.4.31

2 release files

4.4.30

2 release files

4.4.29

2 release files

4.4.28

2 release files

4.4.26

2 release files

4.4.25

2 release files

4.4.24

2 release files

4.4.23

2 release files

4.4.22

2 release files

4.4.21

2 release files

4.4.20

2 release files

4.4.19

2 release files

4.4.18

2 release files

4.4.17

2 release files

4.4.16

2 release files

4.4.15

2 release files

4.4.14

2 release files

4.4.13

2 release files

4.4.12

2 release files

4.4.11

2 release files

4.4.10

2 release files

4.4.9

2 release files

4.4.8

2 release files

4.4.7

2 release files

4.4.6

2 release files

4.4.5

2 release files

4.4.4

2 release files

4.4.3

2 release files

4.4.2

2 release files

4.4.1

2 release files

4.3.25

2 release files

4.3.23

2 release files

4.3.22

2 release files

4.3.21

2 release files

4.3.20

2 release files

4.3.19

2 release files

4.3.18

2 release files

4.3.17

2 release files

4.3.16

2 release files

4.3.15

2 release files

4.3.14

2 release files

4.3.13

2 release files

4.3.12

2 release files

4.3.11

2 release files

4.3.10

2 release files

4.3.9

2 release files

4.3.8

2 release files

4.3.7

2 release files

4.3.6

2 release files

4.3.5

2 release files

4.3.4

2 release files

4.3.3

2 release files

4.3.2

2 release files

4.3.1

2 release files

4.2.96

2 release files

4.2.95

2 release files

4.2.94

2 release files

4.2.93

2 release files

4.2.92

2 release files

4.2.91

2 release files

4.2.89

2 release files

4.2.88

2 release files

4.2.87

2 release files

4.2.85

2 release files

4.2.84

2 release files

4.2.83

2 release files

4.2.82

2 release files

4.2.81

2 release files

4.2.80

2 release files

4.2.79

2 release files

4.2.76

2 release files

4.2.75

2 release files

4.2.74

2 release files

4.2.73

2 release files

4.2.72

2 release files

4.2.71

2 release files

4.2.70

2 release files

4.2.69

2 release files

4.2.68

2 release files

4.2.67

2 release files

4.2.66

2 release files

4.2.65

2 release files

4.2.64

2 release files

4.2.16

2 release files

4.2.15

2 release files

4.2.14

2 release files

4.2.13

2 release files

4.2.12

2 release files

4.2.11

2 release files

4.2.10

2 release files

4.2.9

2 release files

4.2.8

2 release files

4.2.7

2 release files

4.2.6

2 release files

4.2.5

2 release files

4.2.4

2 release files

4.2.3

2 release files

4.2.2

2 release files

4.2.1

2 release files

4.2.0

2 release files

4.1.44

2 release files

4.1.43

2 release files

4.1.42

2 release files

4.1.41

2 release files

4.1.40

2 release files

4.1.39

2 release files

4.1.38

2 release files

4.1.37

2 release files

4.1.36

2 release files

4.1.35

2 release files

4.1.34

2 release files

4.1.33

2 release files

4.1.32

2 release files

4.1.31

2 release files

4.1.30

2 release files

4.1.29

2 release files

4.1.28

2 release files

4.1.27

2 release files

4.1.26

2 release files

4.1.25

2 release files

4.1.24

2 release files

4.1.23

2 release files

4.1.22

2 release files

4.1.21

2 release files

4.1.20

2 release files

4.1.19

2 release files

4.1.18

2 release files

4.1.9

2 release files

4.1.8

2 release files

4.1.7

2 release files

4.1.6

2 release files

4.1.5

2 release files

4.1.4

2 release files

4.1.3

2 release files

4.1.2

2 release files

4.1.1

2 release files

4.1.0

2 release files

4.0.72

2 release files

4.0.71

2 release files

4.0.70

2 release files

4.0.68

2 release files

4.0.67

2 release files

4.0.66

2 release files

4.0.65

2 release files

4.0.64

2 release files

4.0.63

2 release files

4.0.62

2 release files

4.0.61

2 release files

4.0.60

2 release files

4.0.59

2 release files

4.0.58

2 release files

4.0.57

2 release files

4.0.56

2 release files

4.0.55

2 release files

4.0.53

2 release files

4.0.52

2 release files

4.0.51

2 release files

4.0.50

2 release files

4.0.49

2 release files

4.0.48

2 release files

4.0.47

2 release files

4.0.46

2 release files

4.0.45

2 release files

4.0.43

2 release files

4.0.42

2 release files

4.0.41

2 release files

4.0.40

2 release files

4.0.38

2 release files

4.0.37

2 release files

4.0.36

2 release files

4.0.34

2 release files

4.0.33

2 release files

4.0.32

2 release files

4.0.31

2 release files

4.0.30

2 release files

4.0.29

2 release files

4.0.28

2 release files

4.0.27

2 release files

4.0.26

2 release files

4.0.25

2 release files

4.0.24

2 release files

4.0.21

2 release files

4.0.20

2 release files

4.0.9

2 release files

4.0.8

2 release files

4.0.7

2 release files

4.0.6

2 release files

4.0.5

2 release files

4.0.4

2 release files

4.0.3

2 release files

4.0.2

2 release files

4.0.1

2 release files

4.0.0

2 release files

0.3.52

2 release files

0.3.51

2 release files

0.3.36

2 release files

0.3.35

2 release files

0.3.33

2 release files

0.3.32

2 release files

0.3.24

2 release files

0.3.23

2 release files

0.3.22

2 release files

0.3.21

2 release files

0.3.20

2 release files

0.3.19

2 release files

0.3.18

2 release files

0.3.17

2 release files

0.3.16

2 release files

0.3.15

2 release files

0.3.14

2 release files

0.3.13

2 release files

0.3.12

2 release files

0.3.11

2 release files

0.3.10

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.14

2 release files

0.2.13

2 release files

0.2.12

2 release files

0.2.11

2 release files

0.2.10

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.99

2 release files

0.1.98

2 release files

0.1.97

2 release files

0.1.96

2 release files

0.1.91

2 release files

0.1.90

2 release files

0.1.89

2 release files

0.1.88

2 release files

0.1.87

2 release files

0.1.86

2 release files

0.1.85

2 release files

0.1.81

2 release files

0.1.73

2 release files

0.1.72

2 release files

0.1.71

2 release files

0.1.70

2 release files

0.1.69

2 release files

0.1.68

2 release files

0.1.66

2 release files

0.1.65

2 release files

0.1.64

2 release files

0.1.63

2 release files

0.1.62

2 release files

0.1.61

2 release files

0.1.60

2 release files

0.1.59

2 release files

0.1.58

2 release files

0.1.57

2 release files

0.1.56

2 release files

0.1.55

2 release files

0.1.54

2 release files

0.1.53

2 release files

0.1.52

2 release files

0.1.51

2 release files

0.1.49

2 release files

0.1.48

2 release files

0.1.47

2 release files

0.1.46

2 release files

0.1.45

2 release files

0.1.20

2 release files

0.1.18

2 release files

0.1.16

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.90

2 release files

0.0.89

2 release files

0.0.88

2 release files

0.0.87

2 release files

0.0.86

2 release files

0.0.85

2 release files

0.0.84

2 release files

0.0.83

2 release files

0.0.82

2 release files

0.0.81

2 release files

0.0.80

2 release files

0.0.79

2 release files

0.0.78

2 release files

0.0.76

2 release files

0.0.75

2 release files

0.0.74

2 release files

0.0.73

2 release files

0.0.72

2 release files

0.0.71

2 release files

0.0.70

2 release files

0.0.69

2 release files

0.0.68

2 release files

0.0.67

2 release files

0.0.61

2 release files

0.0.60

2 release files

0.0.59

2 release files

0.0.58

2 release files

0.0.57

2 release files

0.0.56

2 release files

0.0.55

2 release files

0.0.54

2 release files

0.0.53

2 release files

0.0.52

2 release files

0.0.51

2 release files

0.0.50

2 release files

0.0.49

2 release files

0.0.48

2 release files

0.0.47

2 release files

0.0.46

2 release files

0.0.31

2 release files

0.0.30

2 release files

0.0.29

2 release files

0.0.28

2 release files

0.0.27

2 release files

0.0.26

2 release files

0.0.25

2 release files

0.0.20

2 release files

0.0.19

2 release files

0.0.18

2 release files

0.0.17

2 release files

0.0.16

2 release files

0.0.15

2 release files

0.0.14

2 release files

0.0.13

2 release files

0.0.12

2 release files

0.0.11

2 release files

0.0.10

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page