octostar-python-client 0.1.759__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- octostar_python_client-0.1.759/CLAUDE.md +170 -0
- octostar_python_client-0.1.759/LICENSE +21 -0
- octostar_python_client-0.1.759/PKG-INFO +159 -0
- octostar_python_client-0.1.759/README.md +122 -0
- octostar_python_client-0.1.759/__init__.py +0 -0
- octostar_python_client-0.1.759/examples/README.md +54 -0
- octostar_python_client-0.1.759/examples/create_linkchart_demo.py +404 -0
- octostar_python_client-0.1.759/octostar/__init__.py +9 -0
- octostar_python_client-0.1.759/octostar/api/__init__.py +1 -0
- octostar_python_client-0.1.759/octostar/api/apps/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/api/apps/deploy_app.py +210 -0
- octostar_python_client-0.1.759/octostar/api/apps/execute_app_job.py +188 -0
- octostar_python_client-0.1.759/octostar/api/apps/get_app_logs.py +210 -0
- octostar_python_client-0.1.759/octostar/api/apps/get_apps_url.py +188 -0
- octostar_python_client-0.1.759/octostar/api/apps/get_job_logs.py +210 -0
- octostar_python_client-0.1.759/octostar/api/apps/get_job_progress.py +162 -0
- octostar_python_client-0.1.759/octostar/api/apps/kill_job.py +160 -0
- octostar_python_client-0.1.759/octostar/api/apps/list_app_jobs.py +276 -0
- octostar_python_client-0.1.759/octostar/api/apps/list_apps.py +251 -0
- octostar_python_client-0.1.759/octostar/api/apps/set_job_progress.py +216 -0
- octostar_python_client-0.1.759/octostar/api/apps/undeploy_app.py +160 -0
- octostar_python_client-0.1.759/octostar/api/metadata/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/api/metadata/get_version.py +232 -0
- octostar_python_client-0.1.759/octostar/api/metadata/get_whoami.py +232 -0
- octostar_python_client-0.1.759/octostar/api/notifications/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/api/notifications/delete_stream.py +222 -0
- octostar_python_client-0.1.759/octostar/api/notifications/get_subscriptions.py +240 -0
- octostar_python_client-0.1.759/octostar/api/notifications/publish_notification.py +275 -0
- octostar_python_client-0.1.759/octostar/api/notifications/pull_events_from_stream.py +282 -0
- octostar_python_client-0.1.759/octostar/api/notifications/push_event_to_stream.py +265 -0
- octostar_python_client-0.1.759/octostar/api/notifications/toast.py +264 -0
- octostar_python_client-0.1.759/octostar/api/ontology/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/api/ontology/fetch_ontology_data.py +275 -0
- octostar_python_client-0.1.759/octostar/api/ontology/get_ontologies.py +237 -0
- octostar_python_client-0.1.759/octostar/api/ontology/multi_query.py +297 -0
- octostar_python_client-0.1.759/octostar/api/ontology/query.py +276 -0
- octostar_python_client-0.1.759/octostar/api/pipeline/__init__.py +1 -0
- octostar_python_client-0.1.759/octostar/api/pipeline/get_processing_status.py +185 -0
- octostar_python_client-0.1.759/octostar/api/pipeline/update_processing_status.py +164 -0
- octostar_python_client-0.1.759/octostar/api/search/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/api/search/get_annotations.py +153 -0
- octostar_python_client-0.1.759/octostar/api/workspace_data/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/api/workspace_data/delete_blob.py +212 -0
- octostar_python_client-0.1.759/octostar/api/workspace_data/delete_entities.py +326 -0
- octostar_python_client-0.1.759/octostar/api/workspace_data/download_blob.py +235 -0
- octostar_python_client-0.1.759/octostar/api/workspace_data/get_attachment.py +336 -0
- octostar_python_client-0.1.759/octostar/api/workspace_data/get_files_tree.py +397 -0
- octostar_python_client-0.1.759/octostar/api/workspace_data/upload_blob.py +235 -0
- octostar_python_client-0.1.759/octostar/api/workspace_data/upsert_entities.py +284 -0
- octostar_python_client-0.1.759/octostar/api/workspace_permissions/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/api/workspace_permissions/get_permissions.py +325 -0
- octostar_python_client-0.1.759/octostar/api/workspace_tags/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/api/workspace_tags/delete_tag_from_entities.py +141 -0
- octostar_python_client-0.1.759/octostar/api/workspace_tags/tag_entities.py +180 -0
- octostar_python_client-0.1.759/octostar/client.py +492 -0
- octostar_python_client-0.1.759/octostar/errors.py +50 -0
- octostar_python_client-0.1.759/octostar/models/__init__.py +249 -0
- octostar_python_client-0.1.759/octostar/models/acknowledgement.py +74 -0
- octostar_python_client-0.1.759/octostar/models/acknowledgement_with_data.py +82 -0
- octostar_python_client-0.1.759/octostar/models/app_status.py +239 -0
- octostar_python_client-0.1.759/octostar/models/app_status_annotations.py +66 -0
- octostar_python_client-0.1.759/octostar/models/app_status_labels.py +69 -0
- octostar_python_client-0.1.759/octostar/models/app_with_url.py +82 -0
- octostar_python_client-0.1.759/octostar/models/child_processing_status.py +118 -0
- octostar_python_client-0.1.759/octostar/models/delete_entities_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/delete_entities_response_409.py +82 -0
- octostar_python_client-0.1.759/octostar/models/delete_entities_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/delete_stream_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/delete_tag_from_entities_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_json_body.py +90 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_json_body_secrets.py +65 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_response_200.py +98 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_response_200_data.py +60 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_response_400.py +82 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_response_403.py +82 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_response_404.py +82 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_response_409.py +82 -0
- octostar_python_client-0.1.759/octostar/models/deploy_app_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/entity.py +80 -0
- octostar_python_client-0.1.759/octostar/models/entity_response.py +99 -0
- octostar_python_client-0.1.759/octostar/models/entity_response_s3_urls.py +93 -0
- octostar_python_client-0.1.759/octostar/models/entity_response_s3_urls_additional_property.py +105 -0
- octostar_python_client-0.1.759/octostar/models/entity_response_s3_urls_additional_property_fields.py +114 -0
- octostar_python_client-0.1.759/octostar/models/execute_app_job_json_body.py +151 -0
- octostar_python_client-0.1.759/octostar/models/execute_app_job_json_body_annotation.py +65 -0
- octostar_python_client-0.1.759/octostar/models/execute_app_job_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/fetch_ontology_data_response_200.py +60 -0
- octostar_python_client-0.1.759/octostar/models/fetch_ontology_data_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/fetch_ontology_data_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/get_app_logs_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_app_logs_response_404.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_app_logs_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/get_apps_url_json_body.py +76 -0
- octostar_python_client-0.1.759/octostar/models/get_apps_url_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_apps_url_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/get_attachment_response_200.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_attachment_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_200.py +106 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_200_status.py +8 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_400.py +111 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_400_data.py +60 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_400_status.py +8 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_500.py +111 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_500_data.py +60 -0
- octostar_python_client-0.1.759/octostar/models/get_files_tree_response_500_status.py +8 -0
- octostar_python_client-0.1.759/octostar/models/get_job_logs_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_job_logs_response_404.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_job_logs_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/get_job_progress_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_object_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_ontologies_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_ontologies_response_500.py +81 -0
- octostar_python_client-0.1.759/octostar/models/get_permissions_response_200.py +98 -0
- octostar_python_client-0.1.759/octostar/models/get_permissions_response_400.py +82 -0
- octostar_python_client-0.1.759/octostar/models/get_permissions_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_permissions_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/get_processing_status_response_200.py +104 -0
- octostar_python_client-0.1.759/octostar/models/get_processing_status_response_200_data.py +87 -0
- octostar_python_client-0.1.759/octostar/models/get_processing_status_response_400.py +82 -0
- octostar_python_client-0.1.759/octostar/models/get_processing_status_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/get_subscriptions_response_200_item.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_version_response_200.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_version_response_404.py +74 -0
- octostar_python_client-0.1.759/octostar/models/get_whoami_response_200.py +129 -0
- octostar_python_client-0.1.759/octostar/models/get_whoami_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/insert_entity.py +114 -0
- octostar_python_client-0.1.759/octostar/models/insert_entity_base.py +266 -0
- octostar_python_client-0.1.759/octostar/models/insert_entity_relationships_item.py +107 -0
- octostar_python_client-0.1.759/octostar/models/insert_entity_request.py +94 -0
- octostar_python_client-0.1.759/octostar/models/internal_server_error.py +82 -0
- octostar_python_client-0.1.759/octostar/models/job_execution_result.py +146 -0
- octostar_python_client-0.1.759/octostar/models/job_status.py +196 -0
- octostar_python_client-0.1.759/octostar/models/job_status_labels.py +60 -0
- octostar_python_client-0.1.759/octostar/models/job_with_url.py +82 -0
- octostar_python_client-0.1.759/octostar/models/kill_job_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/list_app_jobs_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/list_app_jobs_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/list_apps_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/list_apps_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/multi_query_json_body.py +100 -0
- octostar_python_client-0.1.759/octostar/models/multi_query_json_body_queries_item.py +80 -0
- octostar_python_client-0.1.759/octostar/models/multi_query_response_400.py +82 -0
- octostar_python_client-0.1.759/octostar/models/multi_query_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/not_found_error.py +74 -0
- octostar_python_client-0.1.759/octostar/models/octostar_event.py +96 -0
- octostar_python_client-0.1.759/octostar/models/octostar_event_octostar_payload.py +100 -0
- octostar_python_client-0.1.759/octostar/models/octostar_event_octostar_payload_level.py +11 -0
- octostar_python_client-0.1.759/octostar/models/os_notification.py +122 -0
- octostar_python_client-0.1.759/octostar/models/processing_status.py +262 -0
- octostar_python_client-0.1.759/octostar/models/processing_status_code.py +14 -0
- octostar_python_client-0.1.759/octostar/models/progress_request.py +73 -0
- octostar_python_client-0.1.759/octostar/models/publish_notification_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/pull_events_from_stream_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/push_event_to_stream_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/query_json_body.py +101 -0
- octostar_python_client-0.1.759/octostar/models/query_json_body_params.py +60 -0
- octostar_python_client-0.1.759/octostar/models/query_response_400.py +82 -0
- octostar_python_client-0.1.759/octostar/models/query_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/set_job_progress_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/string_to_value_label_map.py +99 -0
- octostar_python_client-0.1.759/octostar/models/string_to_value_label_map_data.py +89 -0
- octostar_python_client-0.1.759/octostar/models/string_to_value_label_map_data_additional_property.py +80 -0
- octostar_python_client-0.1.759/octostar/models/successful_get_tags.py +103 -0
- octostar_python_client-0.1.759/octostar/models/successful_insertion.py +98 -0
- octostar_python_client-0.1.759/octostar/models/tag_entities_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/toast_level.py +11 -0
- octostar_python_client-0.1.759/octostar/models/toast_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/undeploy_app_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/update_processing_status_response_200.py +82 -0
- octostar_python_client-0.1.759/octostar/models/update_processing_status_response_400.py +82 -0
- octostar_python_client-0.1.759/octostar/models/update_processing_status_response_500.py +82 -0
- octostar_python_client-0.1.759/octostar/models/upsert_entities_response_401.py +74 -0
- octostar_python_client-0.1.759/octostar/models/upsert_entity.py +114 -0
- octostar_python_client-0.1.759/octostar/models/upsert_entity_base.py +266 -0
- octostar_python_client-0.1.759/octostar/models/upsert_entity_relationships_item.py +107 -0
- octostar_python_client-0.1.759/octostar/py.typed +1 -0
- octostar_python_client-0.1.759/octostar/types.py +54 -0
- octostar_python_client-0.1.759/octostar/utils/__init__.py +15 -0
- octostar_python_client-0.1.759/octostar/utils/chat/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/chat/chat.py +513 -0
- octostar_python_client-0.1.759/octostar/utils/chat/detokenize.py +105 -0
- octostar_python_client-0.1.759/octostar/utils/chat/get_default_model.py +50 -0
- octostar_python_client-0.1.759/octostar/utils/chat/list_models.py +91 -0
- octostar_python_client-0.1.759/octostar/utils/chat/tokenize.py +105 -0
- octostar_python_client-0.1.759/octostar/utils/commons.py +226 -0
- octostar_python_client-0.1.759/octostar/utils/exceptions.py +134 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/deploy_app.py +81 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/execute_app_job.py +114 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/get_app_logs.py +113 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/get_app_secret.py +102 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/get_apps_url.py +73 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/list_app_jobs.py +62 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/list_apps.py +126 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/apps/undeploy_app.py +48 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/get_job_logs.py +113 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/get_job_progress.py +76 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/kill_job.py +47 -0
- octostar_python_client-0.1.759/octostar/utils/jobs/set_job_progress.py +67 -0
- octostar_python_client-0.1.759/octostar/utils/meta/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/meta/get_version.py +30 -0
- octostar_python_client-0.1.759/octostar/utils/meta/get_whoami.py +30 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/delete_stream.py +58 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/get_my_subscriptions.py +49 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/publish_notification.py +73 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/pull_event_from_stream.py +63 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/pull_events_from_stream.py +64 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/push_event_to_stream.py +109 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/push_events_to_stream.py +137 -0
- octostar_python_client-0.1.759/octostar/utils/notifications/toast.py +92 -0
- octostar_python_client-0.1.759/octostar/utils/ontology/__init__.py +10 -0
- octostar_python_client-0.1.759/octostar/utils/ontology/fetch_ontology_data.py +141 -0
- octostar_python_client-0.1.759/octostar/utils/ontology/get_ontologies.py +55 -0
- octostar_python_client-0.1.759/octostar/utils/ontology/multiquery_ontology.py +287 -0
- octostar_python_client-0.1.759/octostar/utils/ontology/query_ontology.py +186 -0
- octostar_python_client-0.1.759/octostar/utils/pipeline/__init__.py +1 -0
- octostar_python_client-0.1.759/octostar/utils/pipeline/get_processing_status.py +230 -0
- octostar_python_client-0.1.759/octostar/utils/pipeline/update_processing_status.py +286 -0
- octostar_python_client-0.1.759/octostar/utils/search/__init__.py +11 -0
- octostar_python_client-0.1.759/octostar/utils/search/bulk_update.py +138 -0
- octostar_python_client-0.1.759/octostar/utils/search/count.py +117 -0
- octostar_python_client-0.1.759/octostar/utils/search/get_entity_annotations.py +304 -0
- octostar_python_client-0.1.759/octostar/utils/search/get_index_definition.py +111 -0
- octostar_python_client-0.1.759/octostar/utils/search/multi_search.py +129 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/delete_entities.py +247 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/delete_entity.py +81 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/delete_relationship.py +78 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/delete_relationships.py +85 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/delete_temporary_blob.py +85 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/extract_entities.py +140 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/get_filepath_from_item.py +85 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/get_filepaths_from_items.py +100 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/get_files_tree.py +102 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/get_item_from_filepath.py +102 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/get_items_from_filepaths.py +108 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/linkcharts/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/linkcharts/create_linkchart.py +241 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/permissions/PermissionLevel.py +8 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/permissions/__init__.py +1 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/permissions/get_permissions.py +81 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/read_attachment.py +284 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/read_file.py +113 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/read_temporary_blob.py +428 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/saved_searches/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/saved_searches/create_saved_search.py +183 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/tags/__init__.py +0 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/tags/delete_tag_from_entities.py +96 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/tags/tag_entities.py +175 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/upsert_entities.py +268 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/upsert_entity.py +110 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/upsert_relationship.py +128 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/upsert_relationships.py +194 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/write_attachment.py +263 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/write_file.py +335 -0
- octostar_python_client-0.1.759/octostar/utils/workspace/write_temporary_blob.py +218 -0
- octostar_python_client-0.1.759/octostar_python_client.egg-info/PKG-INFO +159 -0
- octostar_python_client-0.1.759/octostar_python_client.egg-info/SOURCES.txt +268 -0
- octostar_python_client-0.1.759/octostar_python_client.egg-info/dependency_links.txt +1 -0
- octostar_python_client-0.1.759/octostar_python_client.egg-info/requires.txt +15 -0
- octostar_python_client-0.1.759/octostar_python_client.egg-info/top_level.txt +1 -0
- octostar_python_client-0.1.759/pyproject.toml +60 -0
- octostar_python_client-0.1.759/setup.cfg +4 -0
- octostar_python_client-0.1.759/tests/conftest.py +464 -0
- octostar_python_client-0.1.759/tests/test_contracts.py +1317 -0
- octostar_python_client-0.1.759/tests/test_upsert_validation_errors.py +288 -0
- octostar_python_client-0.1.759/uv.lock +523 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# CLAUDE.md — octostar_python_client SDK
|
|
2
|
+
|
|
3
|
+
## Critical Rule: Do Not Break the Public API
|
|
4
|
+
|
|
5
|
+
This SDK is consumed by **production legacy applications** (Streamlit apps, backend services, scheduled jobs) that import and call its functions directly. The public API surface is a hard contract.
|
|
6
|
+
|
|
7
|
+
### What you MUST NOT change
|
|
8
|
+
|
|
9
|
+
- **Function signatures**: Every endpoint module exposes `sync()`, `sync_detailed()`, `asyncio()`, `asyncio_detailed()` with their current parameter names, types, and return types. Do not rename, reorder, add required params, or change return types.
|
|
10
|
+
- **Module paths**: Code like `from octostar.api.notifications import delete_stream` must continue to resolve. Do not move, rename, or delete modules.
|
|
11
|
+
- **Model classes**: The `octostar/models/` classes use `@attr.s` with `to_dict()` / `from_dict()`. Their field names map to API JSON keys. Do not rename fields or change serialization.
|
|
12
|
+
- **Client classes**: `Client`, `AuthenticatedClient`, `make_client()`, `as_launching_user()`, `as_running_user()` are the primary entry points. Their interfaces are frozen.
|
|
13
|
+
- **Error classes**: `UnexpectedStatus`, `DeprecatedEndpointError`, `V1MigrationPendingError` are caught by consumer code.
|
|
14
|
+
|
|
15
|
+
### What you CAN change
|
|
16
|
+
|
|
17
|
+
- **Internal implementation** of `_get_kwargs()`, `_parse_response()`, `_build_response()` — these are private. You can change URLs, add new status code handlers, adjust request construction.
|
|
18
|
+
- **Response body handling** inside `_parse_response()` — as long as the parsed type stays compatible.
|
|
19
|
+
- **Default values** for optional parameters (e.g. timeouts), within reason.
|
|
20
|
+
- **Adding new status code branches** to `_parse_response()` when the FastAPI backend changes behavior.
|
|
21
|
+
|
|
22
|
+
### When the backend API changes
|
|
23
|
+
|
|
24
|
+
If a FastAPI endpoint changes its URL, request format, or response shape, adapt the SDK's **internal implementation** to keep the external function signatures working. The SDK acts as a compatibility shim between the new backend and old consumer code.
|
|
25
|
+
|
|
26
|
+
Example: if the backend moves from `/api/octostar/streams/{id}` to `/api/v1/streams/{id}`, update `_get_kwargs()` to use `client.get_base_url_v1()` instead of `client.get_base_url_v1()`. The consumer code calling `delete_stream.sync(stream_id="x", client=c)` should not notice.
|
|
27
|
+
|
|
28
|
+
### When an endpoint is permanently removed
|
|
29
|
+
|
|
30
|
+
Use `DeprecatedEndpointError` — preserve the function signatures but raise on call:
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
def sync(stream_id: str, *, client: Any = None, ...) -> Optional[Any]:
|
|
34
|
+
raise DeprecatedEndpointError("delete_stream", "Removed in v2. Use X instead.")
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### When an endpoint is not yet migrated
|
|
38
|
+
|
|
39
|
+
Use `V1MigrationPendingError` to signal the endpoint will exist in the new backend but isn't ready yet.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## SDK Architecture
|
|
44
|
+
|
|
45
|
+
### Origin
|
|
46
|
+
|
|
47
|
+
Originally **generated from OpenAPI spec** (`openapi.json`) targeting the old Superset-based backend. Now manually maintained as the backend migrates to FastAPI. The generation patterns are preserved for consistency.
|
|
48
|
+
|
|
49
|
+
### Two-Layer Design
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
octostar/
|
|
53
|
+
├── api/ # Low-level HTTP layer (generated pattern)
|
|
54
|
+
│ └── <tag>/ # One module per endpoint
|
|
55
|
+
│ └── <op>.py # _get_kwargs → _parse_response → sync/asyncio
|
|
56
|
+
├── utils/ # High-level helper layer (hand-written)
|
|
57
|
+
│ └── <domain>/ # User-friendly wrappers around api/ modules
|
|
58
|
+
├── models/ # Data models (@attr.s with to_dict/from_dict)
|
|
59
|
+
├── client.py # Client, AuthenticatedClient, make_client()
|
|
60
|
+
├── types.py # Response[T], File, UNSET sentinel
|
|
61
|
+
└── errors.py # UnexpectedStatus, DeprecatedEndpointError, V1MigrationPendingError
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**api/ layer**: Raw HTTP — builds request kwargs, parses responses by status code, returns typed `Response[T]`. Each module has exactly 4 public functions + 3 private helpers.
|
|
65
|
+
|
|
66
|
+
**utils/ layer**: Wraps api/ calls with business logic, retries, convenience methods. This is what most consumer code actually uses.
|
|
67
|
+
|
|
68
|
+
### Endpoint Module Pattern
|
|
69
|
+
|
|
70
|
+
Every module in `api/` follows this exact structure:
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
client_missing_msg = '...' # Deprecation warning for default client
|
|
74
|
+
|
|
75
|
+
def _get_kwargs(...) -> Dict: # Build httpx request dict
|
|
76
|
+
def _parse_response(...) -> Optional: # Map status codes to typed models
|
|
77
|
+
def _build_response(...) -> Response: # Wrap in Response[T]
|
|
78
|
+
|
|
79
|
+
def sync_detailed(...) -> Response[T]: # Sync, full response
|
|
80
|
+
def sync(...) -> Optional[T]: # Sync, parsed only
|
|
81
|
+
async def asyncio_detailed(...) -> Response[T]: # Async, full response
|
|
82
|
+
async def asyncio(...) -> Optional[T]: # Async, parsed only
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Client URL Routing
|
|
86
|
+
|
|
87
|
+
The SDK handles two backend URL schemes:
|
|
88
|
+
|
|
89
|
+
- `client.get_base_url_v1()` — old Superset routes (`/api/octostar/...`)
|
|
90
|
+
- `client.get_base_url_v1()` — new FastAPI routes (`/api/v1/...`), rewrites `home.*` → `api.*` for K8s ingress
|
|
91
|
+
|
|
92
|
+
**Note:** The shared K8s ingress routes `/api/v1/*` to `api.*` regardless of base URL, so either method works for v1 paths.
|
|
93
|
+
|
|
94
|
+
When migrating an endpoint, switch the `_get_kwargs` from `get_base_url_v1()` to `get_base_url_v1()` and update the URL path.
|
|
95
|
+
|
|
96
|
+
### Authentication
|
|
97
|
+
|
|
98
|
+
Token resolution order (in `AuthenticatedClient`):
|
|
99
|
+
1. `fixed_token` parameter (explicit)
|
|
100
|
+
2. File at `/etc/secrets/OS_JWT` (K8s secret mount)
|
|
101
|
+
3. Environment variable `OS_JWT`
|
|
102
|
+
|
|
103
|
+
The `make_client()` factory reads `OS_API_ENDPOINT`, `OS_ONTOLOGY`, and optional `OS_ANCESTOR`, `OS_APP_NAME` from env vars.
|
|
104
|
+
|
|
105
|
+
### Models
|
|
106
|
+
|
|
107
|
+
All models use `@attr.s(auto_attribs=True)` with:
|
|
108
|
+
- `to_dict()` / `from_dict()` for JSON serialization
|
|
109
|
+
- `additional_properties: Dict[str, Any]` for extensibility (unknown API fields)
|
|
110
|
+
- Dict-like access (`__getitem__`, `__setitem__`) for additional properties
|
|
111
|
+
|
|
112
|
+
Response models are status-code-specific: `GetWhoamiResponse200`, `QueryResponse401`, etc.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Testing
|
|
117
|
+
|
|
118
|
+
### Contract Tests (`tests/test_contracts.py`)
|
|
119
|
+
|
|
120
|
+
Validate SDK request construction against `openapi.json` **without network calls**:
|
|
121
|
+
- Every endpoint module has standard functions
|
|
122
|
+
- Request URLs match OpenAPI paths
|
|
123
|
+
- Request bodies match schemas
|
|
124
|
+
|
|
125
|
+
Run: `pytest octostar_python_client/tests/`
|
|
126
|
+
|
|
127
|
+
Note: These tests require the `octostar` package to be importable. If they fail with `ModuleNotFoundError: No module named 'octostar'`, the package needs to be installed in editable mode or the path needs to be on `PYTHONPATH`.
|
|
128
|
+
|
|
129
|
+
### Backend Integration Tests
|
|
130
|
+
|
|
131
|
+
The FastAPI backend has its own tests in `tests/api/v1/` that test the actual endpoints. SDK contract tests complement these by verifying the SDK constructs valid requests.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Common Tasks
|
|
136
|
+
|
|
137
|
+
### Migrating an endpoint from Superset to FastAPI
|
|
138
|
+
|
|
139
|
+
1. In `_get_kwargs()`: change `get_base_url_v1()` → `get_base_url_v1()` and update the URL path
|
|
140
|
+
2. In `_parse_response()`: update status code handling if response shapes changed
|
|
141
|
+
3. Keep function signatures identical
|
|
142
|
+
4. Update `openapi.json` if maintaining spec accuracy
|
|
143
|
+
|
|
144
|
+
### Adding a new status code handler
|
|
145
|
+
|
|
146
|
+
Add a new `if response.status_code == HTTPStatus.XXX:` branch in `_parse_response()`. No signature changes needed.
|
|
147
|
+
|
|
148
|
+
### Deprecating an endpoint
|
|
149
|
+
|
|
150
|
+
Replace function bodies with `raise DeprecatedEndpointError(...)`. Keep signatures intact for import compatibility.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Releasing & testing PR builds
|
|
155
|
+
|
|
156
|
+
Publishing is automated (no manual publish):
|
|
157
|
+
|
|
158
|
+
- **On merge to `main`**, the octostar-api release pipeline publishes the SDK to
|
|
159
|
+
PyPI via OIDC trusted publishing, versioned to the octostar-api GitVersion tag.
|
|
160
|
+
- **On every PR** touching the SDK, `sdk_build.yml` publishes a pre-release to
|
|
161
|
+
TestPyPI versioned `0.0.<pr>.dev<run_number>` so a PR's changes can be
|
|
162
|
+
installed and tested before merge.
|
|
163
|
+
|
|
164
|
+
To install a PR build, point at TestPyPI for the package and PyPI for the deps
|
|
165
|
+
(TestPyPI does not host `httpx`, `tenacity`, …). Full pip/uv commands are in
|
|
166
|
+
`README.md` → "Testing a PR build (TestPyPI)".
|
|
167
|
+
|
|
168
|
+
The version is injected at build time via the `SDK_VERSION` env var, applied by
|
|
169
|
+
`scripts/sdk/set_version.py`. Keep the `version` in `pyproject.toml` as a
|
|
170
|
+
local-dev fallback only.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Octostar
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: octostar-python-client
|
|
3
|
+
Version: 0.1.759
|
|
4
|
+
Summary: A client library for accessing Octostar API
|
|
5
|
+
Author-email: Octostar <systems@octostar.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://octostar.com
|
|
8
|
+
Project-URL: Repository, https://github.com/Octostarco/octostar-api
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Natural Language :: English
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: httpx<0.28.0,>=0.20.0
|
|
24
|
+
Requires-Dist: attrs>=21.3.0
|
|
25
|
+
Requires-Dist: python-dateutil<3,>=2.8.0
|
|
26
|
+
Requires-Dist: PyJWT<3,>=2.0.0
|
|
27
|
+
Requires-Dist: python-dotenv<2,>=1.0.0
|
|
28
|
+
Requires-Dist: tenacity<9,>=8.3.0
|
|
29
|
+
Requires-Dist: aiofiles>=22.0.0
|
|
30
|
+
Requires-Dist: pytimeparse<2,>=1.1.0
|
|
31
|
+
Provides-Extra: streamlit
|
|
32
|
+
Requires-Dist: octostar-streamlit<1,>=0.1.26; extra == "streamlit"
|
|
33
|
+
Provides-Extra: test
|
|
34
|
+
Requires-Dist: pytest>=7.0; extra == "test"
|
|
35
|
+
Requires-Dist: pytest-asyncio>=0.21; extra == "test"
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
|
|
38
|
+
# octostar-python-client
|
|
39
|
+
A client library for accessing Octostar API
|
|
40
|
+
|
|
41
|
+
## Usage
|
|
42
|
+
First, create a client:
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
from octostar import Client
|
|
46
|
+
|
|
47
|
+
client = Client(base_url="https://api.example.com")
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
If the endpoints you're going to hit require authentication, use `AuthenticatedClient` instead:
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
from octostar import AuthenticatedClient
|
|
54
|
+
|
|
55
|
+
client = AuthenticatedClient(base_url="https://api.example.com", token="SuperSecretToken")
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Now call your endpoint and use your models:
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
from octostar.models import MyDataModel
|
|
62
|
+
from octostar.api.my_tag import get_my_data_model
|
|
63
|
+
from octostar.types import Response
|
|
64
|
+
|
|
65
|
+
my_data: MyDataModel = get_my_data_model.sync(client=client)
|
|
66
|
+
# or if you need more info (e.g. status_code)
|
|
67
|
+
response: Response[MyDataModel] = get_my_data_model.sync_detailed(client=client)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Or do the same thing with an async version:
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
from octostar.models import MyDataModel
|
|
74
|
+
from octostar.api.my_tag import get_my_data_model
|
|
75
|
+
from octostar.types import Response
|
|
76
|
+
|
|
77
|
+
my_data: MyDataModel = await get_my_data_model.asyncio(client=client)
|
|
78
|
+
response: Response[MyDataModel] = await get_my_data_model.asyncio_detailed(client=client)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
By default, when you're calling an HTTPS API it will attempt to verify that SSL is working correctly. Using certificate verification is highly recommended most of the time, but sometimes you may need to authenticate to a server (especially an internal server) using a custom certificate bundle.
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
client = AuthenticatedClient(
|
|
85
|
+
base_url="https://internal_api.example.com",
|
|
86
|
+
token="SuperSecretToken",
|
|
87
|
+
verify_ssl="/path/to/certificate_bundle.pem",
|
|
88
|
+
)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
You can also disable certificate validation altogether, but beware that **this is a security risk**.
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
client = AuthenticatedClient(
|
|
95
|
+
base_url="https://internal_api.example.com",
|
|
96
|
+
token="SuperSecretToken",
|
|
97
|
+
verify_ssl=False
|
|
98
|
+
)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
There are more settings on the generated `Client` class which let you control more runtime behavior, check out the docstring on that class for more info.
|
|
102
|
+
|
|
103
|
+
Things to know:
|
|
104
|
+
1. Every path/method combo becomes a Python module with four functions:
|
|
105
|
+
1. `sync`: Blocking request that returns parsed data (if successful) or `None`
|
|
106
|
+
1. `sync_detailed`: Blocking request that always returns a `Request`, optionally with `parsed` set if the request was successful.
|
|
107
|
+
1. `asyncio`: Like `sync` but async instead of blocking
|
|
108
|
+
1. `asyncio_detailed`: Like `sync_detailed` but async instead of blocking
|
|
109
|
+
|
|
110
|
+
1. All path/query params, and bodies become method arguments.
|
|
111
|
+
1. If your endpoint had any tags on it, the first tag will be used as a module name for the function (my_tag above)
|
|
112
|
+
1. Any endpoint which did not have a tag will be in `octostar.api.default`
|
|
113
|
+
|
|
114
|
+
## Installing
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
pip install octostar-python-client
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Testing a PR build (TestPyPI)
|
|
121
|
+
|
|
122
|
+
Every pull request that touches the SDK publishes a pre-release to
|
|
123
|
+
[TestPyPI](https://test.pypi.org/project/octostar-python-client/) versioned
|
|
124
|
+
`0.0.<pr>.dev<run_number>` (e.g. `0.0.898.dev1319`) — the `<pr>` segment is the
|
|
125
|
+
PR number, so you can find the build for your PR. Use it to test SDK changes
|
|
126
|
+
before they merge.
|
|
127
|
+
|
|
128
|
+
TestPyPI does not host third-party dependencies (`httpx`, `tenacity`, …), so
|
|
129
|
+
point the resolver at PyPI as an extra index for them:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# pip
|
|
133
|
+
pip install \
|
|
134
|
+
--index-url https://test.pypi.org/simple/ \
|
|
135
|
+
--extra-index-url https://pypi.org/simple/ \
|
|
136
|
+
octostar-python-client==0.0.<pr>.dev<N>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# uv (--index-strategy so uv considers both indexes per-package)
|
|
141
|
+
uv pip install \
|
|
142
|
+
--index-url https://test.pypi.org/simple/ \
|
|
143
|
+
--extra-index-url https://pypi.org/simple/ \
|
|
144
|
+
--index-strategy unsafe-best-match \
|
|
145
|
+
octostar-python-client==0.0.<pr>.dev<N>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Releasing
|
|
149
|
+
|
|
150
|
+
Releases are automated. On every merge to `main`, the octostar-api release
|
|
151
|
+
pipeline builds this package and publishes it to PyPI, stamped with the
|
|
152
|
+
octostar-api version. There is no manual publish step.
|
|
153
|
+
|
|
154
|
+
To build the package locally for development:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
./scripts/sdk/build.sh # writes octostar_python_client/dist/*.whl and *.tar.gz
|
|
158
|
+
pip install octostar_python_client/dist/*.whl
|
|
159
|
+
```
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# octostar-python-client
|
|
2
|
+
A client library for accessing Octostar API
|
|
3
|
+
|
|
4
|
+
## Usage
|
|
5
|
+
First, create a client:
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
from octostar import Client
|
|
9
|
+
|
|
10
|
+
client = Client(base_url="https://api.example.com")
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
If the endpoints you're going to hit require authentication, use `AuthenticatedClient` instead:
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from octostar import AuthenticatedClient
|
|
17
|
+
|
|
18
|
+
client = AuthenticatedClient(base_url="https://api.example.com", token="SuperSecretToken")
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Now call your endpoint and use your models:
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from octostar.models import MyDataModel
|
|
25
|
+
from octostar.api.my_tag import get_my_data_model
|
|
26
|
+
from octostar.types import Response
|
|
27
|
+
|
|
28
|
+
my_data: MyDataModel = get_my_data_model.sync(client=client)
|
|
29
|
+
# or if you need more info (e.g. status_code)
|
|
30
|
+
response: Response[MyDataModel] = get_my_data_model.sync_detailed(client=client)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Or do the same thing with an async version:
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
from octostar.models import MyDataModel
|
|
37
|
+
from octostar.api.my_tag import get_my_data_model
|
|
38
|
+
from octostar.types import Response
|
|
39
|
+
|
|
40
|
+
my_data: MyDataModel = await get_my_data_model.asyncio(client=client)
|
|
41
|
+
response: Response[MyDataModel] = await get_my_data_model.asyncio_detailed(client=client)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
By default, when you're calling an HTTPS API it will attempt to verify that SSL is working correctly. Using certificate verification is highly recommended most of the time, but sometimes you may need to authenticate to a server (especially an internal server) using a custom certificate bundle.
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
client = AuthenticatedClient(
|
|
48
|
+
base_url="https://internal_api.example.com",
|
|
49
|
+
token="SuperSecretToken",
|
|
50
|
+
verify_ssl="/path/to/certificate_bundle.pem",
|
|
51
|
+
)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
You can also disable certificate validation altogether, but beware that **this is a security risk**.
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
client = AuthenticatedClient(
|
|
58
|
+
base_url="https://internal_api.example.com",
|
|
59
|
+
token="SuperSecretToken",
|
|
60
|
+
verify_ssl=False
|
|
61
|
+
)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
There are more settings on the generated `Client` class which let you control more runtime behavior, check out the docstring on that class for more info.
|
|
65
|
+
|
|
66
|
+
Things to know:
|
|
67
|
+
1. Every path/method combo becomes a Python module with four functions:
|
|
68
|
+
1. `sync`: Blocking request that returns parsed data (if successful) or `None`
|
|
69
|
+
1. `sync_detailed`: Blocking request that always returns a `Request`, optionally with `parsed` set if the request was successful.
|
|
70
|
+
1. `asyncio`: Like `sync` but async instead of blocking
|
|
71
|
+
1. `asyncio_detailed`: Like `sync_detailed` but async instead of blocking
|
|
72
|
+
|
|
73
|
+
1. All path/query params, and bodies become method arguments.
|
|
74
|
+
1. If your endpoint had any tags on it, the first tag will be used as a module name for the function (my_tag above)
|
|
75
|
+
1. Any endpoint which did not have a tag will be in `octostar.api.default`
|
|
76
|
+
|
|
77
|
+
## Installing
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
pip install octostar-python-client
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Testing a PR build (TestPyPI)
|
|
84
|
+
|
|
85
|
+
Every pull request that touches the SDK publishes a pre-release to
|
|
86
|
+
[TestPyPI](https://test.pypi.org/project/octostar-python-client/) versioned
|
|
87
|
+
`0.0.<pr>.dev<run_number>` (e.g. `0.0.898.dev1319`) — the `<pr>` segment is the
|
|
88
|
+
PR number, so you can find the build for your PR. Use it to test SDK changes
|
|
89
|
+
before they merge.
|
|
90
|
+
|
|
91
|
+
TestPyPI does not host third-party dependencies (`httpx`, `tenacity`, …), so
|
|
92
|
+
point the resolver at PyPI as an extra index for them:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# pip
|
|
96
|
+
pip install \
|
|
97
|
+
--index-url https://test.pypi.org/simple/ \
|
|
98
|
+
--extra-index-url https://pypi.org/simple/ \
|
|
99
|
+
octostar-python-client==0.0.<pr>.dev<N>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# uv (--index-strategy so uv considers both indexes per-package)
|
|
104
|
+
uv pip install \
|
|
105
|
+
--index-url https://test.pypi.org/simple/ \
|
|
106
|
+
--extra-index-url https://pypi.org/simple/ \
|
|
107
|
+
--index-strategy unsafe-best-match \
|
|
108
|
+
octostar-python-client==0.0.<pr>.dev<N>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Releasing
|
|
112
|
+
|
|
113
|
+
Releases are automated. On every merge to `main`, the octostar-api release
|
|
114
|
+
pipeline builds this package and publishes it to PyPI, stamped with the
|
|
115
|
+
octostar-api version. There is no manual publish step.
|
|
116
|
+
|
|
117
|
+
To build the package locally for development:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
./scripts/sdk/build.sh # writes octostar_python_client/dist/*.whl and *.tar.gz
|
|
121
|
+
pip install octostar_python_client/dist/*.whl
|
|
122
|
+
```
|
|
File without changes
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# SDK examples
|
|
2
|
+
|
|
3
|
+
Runnable scripts that exercise the `octostar` SDK against a live Octostar
|
|
4
|
+
backend. They're meant for manual testing and as copy-paste starting points,
|
|
5
|
+
not as automated tests.
|
|
6
|
+
|
|
7
|
+
## `create_linkchart_demo.py`
|
|
8
|
+
|
|
9
|
+
Interactive end-to-end demo for `create_linkchart`. It:
|
|
10
|
+
|
|
11
|
+
1. Connects using your JWT and API endpoint.
|
|
12
|
+
2. Searches workspaces by name and lets you pick one.
|
|
13
|
+
3. Searches people by name (one or more) and lets you pick them.
|
|
14
|
+
4. Discovers each person's relationships from the ontology and pulls in the
|
|
15
|
+
related entities (their phones, cars, and anything else the ontology links
|
|
16
|
+
to a person).
|
|
17
|
+
5. Saves the result as a linkchart in the chosen workspace.
|
|
18
|
+
|
|
19
|
+
This verifies the linkchart is written in the current format — an `os_file`
|
|
20
|
+
entity whose attachment body holds the
|
|
21
|
+
`application/octostar-linkchart-settings+json` graph — rather than the legacy
|
|
22
|
+
`os_linkchart` shape.
|
|
23
|
+
|
|
24
|
+
### Run it
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
export OS_JWT='your.jwt.token'
|
|
28
|
+
export OS_API_ENDPOINT='https://home.main.octostar.com/'
|
|
29
|
+
export OS_ONTOLOGY='os_ontology_v1'
|
|
30
|
+
|
|
31
|
+
uv run python octostar_python_client/examples/create_linkchart_demo.py
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
When it finishes it prints the new chart's id and a link to open the
|
|
35
|
+
workspace. Open the chart in the linkchart UI to confirm the nodes and edges
|
|
36
|
+
render.
|
|
37
|
+
|
|
38
|
+
### Useful flags
|
|
39
|
+
|
|
40
|
+
| Flag | Purpose |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| `--ontology` | Ontology name (defaults to `$OS_ONTOLOGY`, else prompted). |
|
|
43
|
+
| `--person-concept` | Concept to search people in (default `os_person`). |
|
|
44
|
+
| `--concepts` | Comma-separated substrings to keep only some neighbour types, e.g. `phone,car`. Empty = include every related entity. |
|
|
45
|
+
| `--search-limit` | Max people returned per name search (default 15). |
|
|
46
|
+
| `--chart-name` | Name for the linkchart (default: prompted). |
|
|
47
|
+
|
|
48
|
+
### Notes
|
|
49
|
+
|
|
50
|
+
- Many-to-many relationships are not traversed by the simple join path and are
|
|
51
|
+
skipped with an `INFO` log; the people you pick plus their one-to-many
|
|
52
|
+
neighbours still make it onto the chart.
|
|
53
|
+
- The script prints each relationship it follows, so a first run is also a
|
|
54
|
+
quick way to learn what your ontology actually calls "phone", "car", etc.
|