auth = dmda.DomoTokenAuth(
domo_instance=os.environ["DOMO_DOJO_INSTANCE"],
domo_access_token=os.environ["DOMO_DOJO_ACCESS_TOKEN"],
)
JUPYTER_TOKEN = " OT98Xy8sePH894pA7SgUhjEcjk1kHK"Jupyter Routes
GET Routes
JupyterAPI_WorkspaceStarted
JupyterAPI_WorkspaceStarted (res, message:str=None)
base exception
JupyterAPI_Error
JupyterAPI_Error (res, message:str=None)
base exception
get_jupyter_workspaces
get_jupyter_workspaces (auth:domolibrary.client.DomoAuth.DomoAuth, parent_class:str=None, session:httpx.AsyncClient=None, debug_num_stacks_to_drop=1, debug_api:bool=False, debug_loop:bool=False)
workspaces = None
workspace_id = None
try:
workspaces = (
await get_jupyter_workspaces(auth, debug_loop=False, debug_api=False)
).response
workspace = next((workspace for workspace in workspaces if workspace['name'] == 'learn_jupyter'))
workspace_id = workspace["id"]
print(workspace)
except Exception as e:
print(e){'id': '1cfe9db4-5937-4889-beb3-a311fc42f246', 'name': 'learn_jupyter', 'description': '', 'created': '2024-02-22T17:13:54.653+00:00', 'updated': '2025-03-27T17:40:57.814+00:00', 'lastRun': '2025-03-27T17:40:57.814+00:00', 'instances': [{'started': '2025-03-27T13:48:51.575+00:00', 'lastActivity': '2025-03-27T17:37:20.746+00:00', 'url': 'https://domo-community.jupyter-prod1.domodatascience.com/hub/auth_refresh?domo_hostname=https%3A%2F%2Fdomo-community.domo.com&next=https%3A%2F%2Fdomo-community.jupyter-prod1.domodatascience.com%2Fuser%2Fdomo-community-1893952720%2F1cfe9db4%2F', 'status': 'RUNNING', 'userId': 1893952720}], 'inputConfiguration': [], 'outputConfiguration': [], 'owner': 1893952720, 'coOwners': [], 'bootstrapKernel': False, 'migrateFiles': False, 'jupyterKernel': 'PYTHON_3_9', 'cpu': 4.0, 'memory': 32.0, 'timeoutHours': 8, 'sharingEnabled': False, 'sharingEnabledBy': 0, 'accountConfiguration': [], 'collectionConfiguration': [], 'fileshareConfiguration': [], 'activityBasedTimeout': True}
get_jupyter_workspace_by_id
get_jupyter_workspace_by_id (auth, workspace_id, parent_class:str=None, session:httpx.AsyncClient=None, debug_api:bool=False, debug_num_stacks_to_drop=2)
(await get_jupyter_workspace_by_id(workspace_id=workspace_id, auth=auth)).response{'id': '1cfe9db4-5937-4889-beb3-a311fc42f246',
'name': 'learn_jupyter',
'description': '',
'created': '2024-02-22T17:13:54.653+00:00',
'updated': '2025-03-27T17:40:57.814+00:00',
'lastRun': '2025-03-27T17:40:57.814+00:00',
'instances': [{'started': '2025-03-27T13:48:51.575+00:00',
'lastActivity': '2025-03-27T17:37:20.746+00:00',
'url': 'https://domo-community.jupyter-prod1.domodatascience.com/hub/auth_refresh?domo_hostname=https%3A%2F%2Fdomo-community.domo.com&next=https%3A%2F%2Fdomo-community.jupyter-prod1.domodatascience.com%2Fuser%2Fdomo-community-1893952720%2F1cfe9db4%2F',
'status': 'RUNNING',
'userId': 1893952720}],
'inputConfiguration': [],
'outputConfiguration': [{'dataSourceId': '84658e41-924e-499c-987b-f82dc10163cc',
'alias': 'DomoStats - Accounts',
'streamId': 1375}],
'owner': 1893952720,
'coOwners': [],
'bootstrapKernel': False,
'migrateFiles': False,
'jupyterKernel': 'PYTHON_3_9',
'cpu': 4.0,
'memory': 32.0,
'timeoutHours': 8,
'instanceTypes': [{'cpu': 0.5, 'memory': 4.0},
{'cpu': 1.0, 'memory': 8.0},
{'cpu': 2.0, 'memory': 16.0},
{'cpu': 4.0, 'memory': 32.0},
{'cpu': 8.0, 'memory': 64.0},
{'cpu': 16.0, 'memory': 128.0},
{'cpu': 32.0, 'memory': 256.0}],
'sharingEnabled': False,
'accountConfiguration': [{'account_id': 88, 'alias': 'fake_account'},
{'account_id': 92, 'alias': 'username_password_auth'},
{'account_id': 94,
'alias': 'my_domo_community_access_token - updated 2024-02-23'},
{'account_id': 100, 'alias': 'domo-community'},
{'account_id': 96, 'alias': 'sdk_domo-community'}],
'collectionConfiguration': [],
'fileshareConfiguration': [],
'activityBasedTimeout': True}
get_workspace_auth_token_params
get_workspace_auth_token_params (workspace_id, auth, return_raw:bool=False)
params are needed for authenticating requests inside the workspace environment Note: you’ll also need a internally generated jupyter_token to authenticate requests returns { service_location , service_prefix}
parse_instance_service_location_and_prefix
parse_instance_service_location_and_prefix (instance:dict, domo_instance)
try:
print(await get_workspace_auth_token_params(workspace_id=workspace_id, auth=auth))
except JupyterAPI_WorkspaceStarted as e:
print(e){'service_location': 'jupyter-prod1.domodatascience.com', 'service_prefix': '/user/domo-community-1893952720/1cfe9db4/'}
start_jupyter_workspace
start_jupyter_workspace (workspace_id, auth:domolibrary.client.DomoAuth.DomoAuth, parent_class:str=None, session:httpx.AsyncClient=None, debug_num_stacks_to_drop=1, debug_api:bool=False, return_raw:bool=False)
try:
print(
await start_jupyter_workspace(
workspace_id=workspace_id,
auth=auth,
debug_api=False,
return_raw=False,
)
)
except Exception as e:
print(e)🛑 JupyterAPI_Error 🛑 - function: get_traceback || status 500 || you may not have access to this workspace 1cfe9db4-5937-4889-beb3-a311fc42f246, is it shared with you? || OR may already be started -- Internal Server Error at domo-community
get_jupyter_content
get_jupyter_content (auth:domolibrary.client.DomoAuth.DomoJupyterAuth, content_path:str='', debug_api:bool=False, debug_num_stacks_to_drop=1, parent_class:str=None, session:httpx.AsyncClient=None)
sample implementation of get_jupyter_content
# currently must scrape from the API
workspace_params = await get_workspace_auth_token_params(
workspace_id=workspace_id, auth=auth
)
dj_auth = dmda.DomoJupyterTokenAuth.convert_auth(
auth=auth, jupyter_token=JUPYTER_TOKEN, **workspace_params
)
dj_authDomoJupyterTokenAuth(jupyter_token=' OT98Xy8sePH894pA7SgUhjEcjk1kHK', service_location='jupyter-prod1.domodatascience.com', service_prefix='/user/domo-community-1893952720/1cfe9db4/', domo_instance='domo-community', url_manual_login='https://domo-community.domo.com/auth/index?domoManualLogin=true', token_name='token_auth', user_id=1893952720, is_valid_token=True)
try:
res = await get_jupyter_content(
auth=dj_auth,
debug_api=None,
)
print(res.response["content"])
except (JupyterAPI_Error, JupyterAPI_WorkspaceStarted, Exception) as e:
print(e)🛑 JupyterAPI_Error 🛑 - function: get_traceback || status 403 || unable to query API, valid jupyter_token? at domo-community
update jupyter content
improve code maintenance by implementing a factory design patternx
generate_update_jupyter_body__new_content_path
generate_update_jupyter_body__new_content_path (content_path)
tests = [
'./admin/hello_world.ipynb',
'./admin/new_folder',
'admin',
''
]
for test in tests:
print(f"{test} - {generate_update_jupyter_body__new_content_path(test)}")./admin/hello_world.ipynb - admin
./admin/new_folder - admin
admin -
-
generate_update_jupyter_body__directory
generate_update_jupyter_body__directory (content_path, body)
generate_update_jupyter_body__ipynb
generate_update_jupyter_body__ipynb (body, content_path=None)
generate_update_jupyter_body__text
generate_update_jupyter_body__text (body, content_path=None)
generate_update_jupyter_body
generate_update_jupyter_body (new_content, content_path:str)
factory to construct properly formed body
| Type | Details | |
|---|---|---|
| new_content | ||
| content_path | str | my_folder/datatypes.ipynb |
generate_update_jupyter_body_factory
generate_update_jupyter_body_factory (value, names=None, module=None, qualname=None, type=None, start=1)
An enumeration.
generate_update_jupyter_body("hello world", "hi.md"){'name': 'hi.md',
'content': 'hello world',
'path': '',
'format': 'text',
'type': 'file'}
generate_update_jupyter_body(None, "admin/new_folder"){'name': 'new_folder',
'content': None,
'path': 'admin',
'format': None,
'type': 'directory'}
CRUD Routes
create_jupyter_obj
create_jupyter_obj (auth:domolibrary.client.DomoAuth.DomoJupyterAuth, new_content='', content_path:str='', debug_api:bool=False, parent_class:str=None, debug_num_stacks_to_drop=1, session:httpx.AsyncClient=None)
| Type | Default | Details | |
|---|---|---|---|
| auth | DomoJupyterAuth | ||
| new_content | str | ||
| content_path | str | file name and location in jupyter | |
| debug_api | bool | False | |
| parent_class | str | None | |
| debug_num_stacks_to_drop | int | 1 | |
| session | AsyncClient | None |
res = None
try:
res = await create_jupyter_obj(
content_path=f"admin-{dt.date.today()}/", auth=dj_auth, debug_api=True
)
except dmde.DomoError as e:
print(e)🐛 debugging get_data
{'body': {'content': '',
'format': None,
'name': 'admin-2025-03-27',
'path': 'admin-2025-03-27',
'type': 'directory'},
'function_name': 'get_traceback',
'headers': {'Connection': 'keep-alive',
'Content-Type': 'application/json',
'accept': 'application/json, text/plain',
'authorization': 'Token OT98Xy8sePH894pA7SgUhjEcjk1kHK',
'x-domo-developer-token': '83ece44f1451d4b581e1191f98cd411164f0b5b6ad2755b3'},
'method': 'POST',
'params': None,
'parent_class': None,
'url': 'https://domo-community.jupyter-prod1.domodatascience.com/user/domo-community-1893952720/1cfe9db4/api/contents/'}
get_data: sending json
get_data_response <Response [403 Forbidden]>
🛑 JupyterAPI_Error 🛑 - function: get_traceback || status 403 || unable to query API, valid jupyter_token? at domo-community
delete_jupyter_content
delete_jupyter_content (auth:domolibrary.client.DomoAuth.DomoJupyterAuth, content_path:str, debug_api:bool=False, parent_class:str=None, debug_num_stacks_to_drop=1, session:httpx.AsyncClient=None)
| Type | Default | Details | |
|---|---|---|---|
| auth | DomoJupyterAuth | ||
| content_path | str | file name and location in jupyter | |
| debug_api | bool | False | |
| parent_class | str | None | |
| debug_num_stacks_to_drop | int | 1 | |
| session | AsyncClient | None |
update_jupyter_file
update_jupyter_file (auth:domolibrary.client.DomoAuth.DomoJupyterAuth, new_content, content_path:str='', debug_api:bool=False, parent_class:str=None, debug_num_stacks_to_drop=1, session:httpx.AsyncClient=None, body:dict=None)
| Type | Default | Details | |
|---|---|---|---|
| auth | DomoJupyterAuth | ||
| new_content | |||
| content_path | str | file name and location in jupyter | |
| debug_api | bool | False | |
| parent_class | str | None | |
| debug_num_stacks_to_drop | int | 1 | |
| session | AsyncClient | None | |
| body | dict | None |
sample implementation of update_content
try:
res = await update_jupyter_file(
auth=dj_auth,
content_path="new_folder",
new_content=None,
debug_api=False,
)
res.response
res = await update_jupyter_file(
auth=dj_auth,
content_path=f"new_folder/updated_{dt.date.today()}.txt",
new_content="jae is excellent at demoes",
debug_api=False,
)
print(res.response)
except (JupyterAPI_Error, JupyterAPI_WorkspaceStarted) as e:
print(e)🛑 JupyterAPI_Error 🛑 - function: get_traceback || status 403 || unable to query API, valid jupyter_token? at domo-community
recursive get_content
get_content
get_content (auth:domolibrary.client.DomoAuth.DomoJupyterAuth, content_path='', is_recursive:bool=True, is_skip_recent_executions:bool=True, is_skip_default_files:bool=True, return_raw:bool=False, debug_api:bool=False, debug_num_stacks_to_drop=2, parent_class:str=None, session:httpx.AsyncClient=None)
sample implementation of get_content_recursive
try:
res = await get_content(
auth=dj_auth,
debug_api=False,
return_raw=True,
is_recursive=False,
content_path="new_folder",
)
# print(
# "num_files",
# len([content for content in res.response if content["type"] != "directory"]),
# )
# pd.DataFrame(res.logs).fillna(0)
if res.response:
display(pd.DataFrame(res.response))
print(res.response)
except (JupyterAPI_Error, JupyterAPI_WorkspaceStarted) as e:
print(e)🛑 JupyterAPI_Error 🛑 - function: get_traceback || status 403 || unable to query API, valid jupyter_token? at domo-community
update_jupyter_workspace_config
update_jupyter_workspace_config (auth:domolibrary.client.DomoAuth.DomoAu th, workspace_id, config:dict, parent_class:str=None, session:httpx.AsyncClient=None, debug_api:bool=False, debug_num_stacks_to_drop=2)