UncountablePythonSDK 0.0.24__py3-none-any.whl → 0.0.131__py3-none-any.whl
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.
Potentially problematic release.
This version of UncountablePythonSDK might be problematic. Click here for more details.
- docs/conf.py +60 -8
- docs/index.md +107 -4
- docs/integration_examples/create_ingredient.md +43 -0
- docs/integration_examples/create_output.md +56 -0
- docs/integration_examples/index.md +6 -0
- docs/justfile +2 -2
- docs/requirements.txt +7 -5
- examples/async_batch.py +5 -6
- examples/basic_auth.py +7 -0
- examples/create_entity.py +4 -6
- examples/create_ingredient_sdk.py +34 -0
- examples/download_files.py +26 -0
- examples/edit_recipe_inputs.py +50 -0
- examples/integration-server/jobs/materials_auto/concurrent_cron.py +11 -0
- examples/integration-server/jobs/materials_auto/example_cron.py +21 -0
- examples/integration-server/jobs/materials_auto/example_http.py +47 -0
- examples/integration-server/jobs/materials_auto/example_instrument.py +100 -0
- examples/integration-server/jobs/materials_auto/example_parse.py +140 -0
- examples/integration-server/jobs/materials_auto/example_predictions.py +61 -0
- examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +39 -0
- examples/integration-server/jobs/materials_auto/example_wh.py +23 -0
- examples/integration-server/jobs/materials_auto/profile.yaml +104 -0
- examples/integration-server/pyproject.toml +224 -0
- examples/invoke_uploader.py +26 -0
- examples/oauth.py +7 -0
- examples/set_recipe_metadata_file.py +40 -0
- examples/set_recipe_output_file_sdk.py +26 -0
- examples/upload_files.py +2 -3
- pkgs/argument_parser/__init__.py +9 -0
- pkgs/argument_parser/_is_namedtuple.py +3 -0
- pkgs/argument_parser/argument_parser.py +295 -74
- pkgs/argument_parser/case_convert.py +4 -3
- pkgs/filesystem_utils/__init__.py +20 -0
- pkgs/filesystem_utils/_blob_session.py +144 -0
- pkgs/filesystem_utils/_gdrive_session.py +309 -0
- pkgs/filesystem_utils/_local_session.py +69 -0
- pkgs/filesystem_utils/_s3_session.py +118 -0
- pkgs/filesystem_utils/_sftp_session.py +151 -0
- pkgs/filesystem_utils/file_type_utils.py +91 -0
- pkgs/filesystem_utils/filesystem_session.py +39 -0
- pkgs/py.typed +0 -0
- pkgs/serialization/__init__.py +8 -1
- pkgs/serialization/annotation.py +64 -0
- pkgs/serialization/missing_sentry.py +1 -1
- pkgs/serialization/opaque_key.py +1 -1
- pkgs/serialization/serial_alias.py +47 -0
- pkgs/serialization/serial_class.py +69 -54
- pkgs/serialization/serial_generic.py +16 -0
- pkgs/serialization/serial_union.py +84 -0
- pkgs/serialization/yaml.py +57 -0
- pkgs/serialization_util/__init__.py +7 -7
- pkgs/serialization_util/convert_to_snakecase.py +27 -0
- pkgs/serialization_util/dataclasses.py +14 -0
- pkgs/serialization_util/serialization_helpers.py +117 -71
- pkgs/type_spec/actions_registry/__main__.py +0 -4
- pkgs/type_spec/actions_registry/emit_typescript.py +5 -5
- pkgs/type_spec/builder.py +438 -109
- pkgs/type_spec/builder_types.py +9 -0
- pkgs/type_spec/config.py +52 -24
- pkgs/type_spec/cross_output_links.py +99 -0
- pkgs/type_spec/emit_io_ts.py +1 -1
- pkgs/type_spec/emit_open_api.py +160 -41
- pkgs/type_spec/emit_open_api_util.py +13 -7
- pkgs/type_spec/emit_python.py +450 -136
- pkgs/type_spec/emit_typescript.py +117 -250
- pkgs/type_spec/emit_typescript_util.py +293 -4
- pkgs/type_spec/load_types.py +20 -5
- pkgs/type_spec/non_discriminated_union_exceptions.py +14 -0
- pkgs/type_spec/open_api_util.py +29 -4
- pkgs/type_spec/parts/base.py.prepart +13 -10
- pkgs/type_spec/parts/base.ts.prepart +4 -0
- pkgs/type_spec/type_info/__main__.py +3 -1
- pkgs/type_spec/type_info/emit_type_info.py +161 -32
- pkgs/type_spec/ui_entry_actions/__init__.py +4 -0
- pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +308 -0
- pkgs/type_spec/util.py +4 -4
- pkgs/type_spec/value_spec/__main__.py +27 -10
- pkgs/type_spec/value_spec/convert_type.py +21 -1
- pkgs/type_spec/value_spec/emit_python.py +25 -7
- pkgs/type_spec/value_spec/types.py +1 -1
- uncountable/__init__.py +1 -2
- uncountable/core/__init__.py +11 -3
- uncountable/core/async_batch.py +16 -1
- uncountable/core/client.py +247 -52
- uncountable/core/environment.py +41 -0
- uncountable/core/file_upload.py +67 -22
- uncountable/core/types.py +8 -13
- uncountable/integration/cli.py +142 -0
- uncountable/integration/construct_client.py +43 -27
- uncountable/integration/cron.py +12 -11
- uncountable/integration/db/connect.py +12 -2
- uncountable/integration/db/session.py +25 -0
- uncountable/integration/entrypoint.py +4 -34
- uncountable/integration/executors/executors.py +147 -0
- uncountable/integration/executors/generic_upload_executor.py +336 -0
- uncountable/integration/executors/script_executor.py +15 -9
- uncountable/integration/http_server/__init__.py +5 -0
- uncountable/integration/http_server/types.py +69 -0
- uncountable/integration/job.py +246 -19
- uncountable/integration/queue_runner/__init__.py +0 -0
- uncountable/integration/queue_runner/command_server/__init__.py +28 -0
- uncountable/integration/queue_runner/command_server/command_client.py +133 -0
- uncountable/integration/queue_runner/command_server/command_server.py +142 -0
- uncountable/integration/queue_runner/command_server/constants.py +4 -0
- uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
- uncountable/integration/queue_runner/command_server/protocol/command_server.proto +58 -0
- uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +57 -0
- uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +114 -0
- uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +264 -0
- uncountable/integration/queue_runner/command_server/types.py +75 -0
- uncountable/integration/queue_runner/datastore/__init__.py +3 -0
- uncountable/integration/queue_runner/datastore/datastore_sqlite.py +250 -0
- uncountable/integration/queue_runner/datastore/interface.py +29 -0
- uncountable/integration/queue_runner/datastore/model.py +24 -0
- uncountable/integration/queue_runner/job_scheduler.py +200 -0
- uncountable/integration/queue_runner/queue_runner.py +34 -0
- uncountable/integration/queue_runner/types.py +7 -0
- uncountable/integration/queue_runner/worker.py +116 -0
- uncountable/integration/scan_profiles.py +67 -0
- uncountable/integration/scheduler.py +199 -0
- uncountable/integration/secret_retrieval/__init__.py +3 -0
- uncountable/integration/secret_retrieval/retrieve_secret.py +93 -0
- uncountable/integration/server.py +103 -54
- uncountable/integration/telemetry.py +251 -0
- uncountable/integration/webhook_server/entrypoint.py +97 -0
- uncountable/types/__init__.py +149 -30
- uncountable/types/api/batch/execute_batch.py +16 -9
- uncountable/types/api/batch/execute_batch_load_async.py +13 -7
- uncountable/types/api/chemical/convert_chemical_formats.py +20 -8
- uncountable/types/api/condition_parameters/__init__.py +1 -0
- uncountable/types/api/condition_parameters/upsert_condition_match.py +72 -0
- uncountable/types/api/entity/create_entities.py +24 -12
- uncountable/types/api/entity/create_entity.py +22 -13
- uncountable/types/api/entity/create_or_update_entity.py +48 -0
- uncountable/types/api/entity/export_entities.py +59 -0
- uncountable/types/api/entity/get_entities_data.py +18 -9
- uncountable/types/api/entity/grant_entity_permissions.py +48 -0
- uncountable/types/api/entity/list_aggregate.py +79 -0
- uncountable/types/api/entity/list_entities.py +53 -14
- uncountable/types/api/entity/lock_entity.py +45 -0
- uncountable/types/api/entity/lookup_entity.py +116 -0
- uncountable/types/api/entity/resolve_entity_ids.py +19 -10
- uncountable/types/api/entity/set_entity_field_values.py +44 -0
- uncountable/types/api/entity/set_values.py +15 -8
- uncountable/types/api/entity/transition_entity_phase.py +27 -12
- uncountable/types/api/entity/unlock_entity.py +44 -0
- uncountable/types/api/equipment/__init__.py +1 -0
- uncountable/types/api/equipment/associate_equipment_input.py +43 -0
- uncountable/types/api/field_options/__init__.py +1 -0
- uncountable/types/api/field_options/upsert_field_options.py +55 -0
- uncountable/types/api/files/__init__.py +1 -0
- uncountable/types/api/files/download_file.py +77 -0
- uncountable/types/api/id_source/list_id_source.py +20 -11
- uncountable/types/api/id_source/match_id_source.py +15 -10
- uncountable/types/api/input_groups/get_input_group_names.py +16 -7
- uncountable/types/api/inputs/create_inputs.py +28 -14
- uncountable/types/api/inputs/get_input_data.py +34 -16
- uncountable/types/api/inputs/get_input_names.py +19 -10
- uncountable/types/api/inputs/get_inputs_data.py +29 -11
- uncountable/types/api/inputs/set_input_attribute_values.py +16 -10
- uncountable/types/api/inputs/set_input_category.py +44 -0
- uncountable/types/api/inputs/set_input_subcategories.py +45 -0
- uncountable/types/api/inputs/set_intermediate_type.py +50 -0
- uncountable/types/api/integrations/__init__.py +1 -0
- uncountable/types/api/integrations/publish_realtime_data.py +41 -0
- uncountable/types/api/integrations/push_notification.py +49 -0
- uncountable/types/api/integrations/register_sockets_token.py +41 -0
- uncountable/types/api/listing/__init__.py +1 -0
- uncountable/types/api/listing/fetch_listing.py +58 -0
- uncountable/types/api/material_families/__init__.py +1 -0
- uncountable/types/api/material_families/update_entity_material_families.py +47 -0
- uncountable/types/api/notebooks/__init__.py +1 -0
- uncountable/types/api/notebooks/add_notebook_content.py +119 -0
- uncountable/types/api/outputs/get_output_data.py +32 -17
- uncountable/types/api/outputs/get_output_names.py +18 -9
- uncountable/types/api/outputs/get_output_organization.py +173 -0
- uncountable/types/api/outputs/resolve_output_conditions.py +23 -11
- uncountable/types/api/permissions/set_core_permissions.py +31 -15
- uncountable/types/api/project/get_projects.py +20 -11
- uncountable/types/api/project/get_projects_data.py +23 -14
- uncountable/types/api/recipe_links/create_recipe_link.py +17 -10
- uncountable/types/api/recipe_links/remove_recipe_link.py +45 -0
- uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +19 -10
- uncountable/types/api/recipes/add_recipe_to_project.py +42 -0
- uncountable/types/api/recipes/add_time_series_data.py +64 -0
- uncountable/types/api/recipes/archive_recipes.py +14 -7
- uncountable/types/api/recipes/associate_recipe_as_input.py +16 -8
- uncountable/types/api/recipes/associate_recipe_as_lot.py +14 -7
- uncountable/types/api/recipes/clear_recipe_outputs.py +42 -0
- uncountable/types/api/recipes/create_mix_order.py +44 -0
- uncountable/types/api/recipes/create_recipe.py +21 -14
- uncountable/types/api/recipes/create_recipes.py +25 -13
- uncountable/types/api/recipes/disassociate_recipe_as_input.py +14 -7
- uncountable/types/api/recipes/edit_recipe_inputs.py +208 -19
- uncountable/types/api/recipes/get_column_calculation_values.py +57 -0
- uncountable/types/api/recipes/get_curve.py +15 -9
- uncountable/types/api/recipes/get_recipe_calculations.py +17 -11
- uncountable/types/api/recipes/get_recipe_links.py +14 -8
- uncountable/types/api/recipes/get_recipe_names.py +16 -7
- uncountable/types/api/recipes/get_recipe_output_metadata.py +16 -10
- uncountable/types/api/recipes/get_recipes_data.py +96 -45
- uncountable/types/api/recipes/lock_recipes.py +64 -0
- uncountable/types/api/recipes/remove_recipe_from_project.py +42 -0
- uncountable/types/api/recipes/set_recipe_inputs.py +19 -13
- uncountable/types/api/recipes/set_recipe_metadata.py +14 -7
- uncountable/types/api/recipes/set_recipe_output_annotations.py +114 -0
- uncountable/types/api/recipes/set_recipe_output_file.py +55 -0
- uncountable/types/api/recipes/set_recipe_outputs.py +40 -15
- uncountable/types/api/recipes/set_recipe_tags.py +30 -13
- uncountable/types/api/recipes/set_recipe_total.py +59 -0
- uncountable/types/api/recipes/unarchive_recipes.py +41 -0
- uncountable/types/api/recipes/unlock_recipes.py +51 -0
- uncountable/types/api/runsheet/__init__.py +1 -0
- uncountable/types/api/runsheet/complete_async_upload.py +41 -0
- uncountable/types/api/triggers/run_trigger.py +15 -8
- uncountable/types/api/uploader/__init__.py +1 -0
- uncountable/types/api/uploader/complete_async_parse.py +46 -0
- uncountable/types/api/uploader/invoke_uploader.py +46 -0
- uncountable/types/api/user/__init__.py +1 -0
- uncountable/types/api/user/get_current_user_info.py +40 -0
- uncountable/types/async_batch.py +8 -52
- uncountable/types/async_batch_processor.py +694 -18
- uncountable/types/async_batch_t.py +108 -0
- uncountable/types/async_jobs.py +8 -0
- uncountable/types/async_jobs_t.py +52 -0
- uncountable/types/auth_retrieval.py +11 -0
- uncountable/types/auth_retrieval_t.py +75 -0
- uncountable/types/base.py +5 -80
- uncountable/types/base_t.py +87 -0
- uncountable/types/calculations.py +3 -19
- uncountable/types/calculations_t.py +26 -0
- uncountable/types/chemical_structure.py +3 -23
- uncountable/types/chemical_structure_t.py +28 -0
- uncountable/types/client_base.py +1170 -88
- uncountable/types/client_config.py +8 -0
- uncountable/types/client_config_t.py +36 -0
- uncountable/types/curves.py +5 -43
- uncountable/types/curves_t.py +50 -0
- uncountable/types/data.py +12 -0
- uncountable/types/data_t.py +103 -0
- uncountable/types/entity.py +8 -270
- uncountable/types/entity_t.py +446 -0
- uncountable/types/experiment_groups.py +3 -19
- uncountable/types/experiment_groups_t.py +26 -0
- uncountable/types/exports.py +8 -0
- uncountable/types/exports_t.py +34 -0
- uncountable/types/field_values.py +25 -61
- uncountable/types/field_values_t.py +302 -0
- uncountable/types/fields.py +3 -20
- uncountable/types/fields_t.py +27 -0
- uncountable/types/generic_upload.py +14 -0
- uncountable/types/generic_upload_t.py +119 -0
- uncountable/types/id_source.py +7 -45
- uncountable/types/id_source_t.py +68 -0
- uncountable/types/identifier.py +6 -50
- uncountable/types/identifier_t.py +62 -0
- uncountable/types/input_attributes.py +3 -25
- uncountable/types/input_attributes_t.py +29 -0
- uncountable/types/inputs.py +6 -57
- uncountable/types/inputs_t.py +82 -0
- uncountable/types/integration_server.py +8 -0
- uncountable/types/integration_server_t.py +46 -0
- uncountable/types/integration_session.py +10 -0
- uncountable/types/integration_session_t.py +60 -0
- uncountable/types/integrations.py +10 -0
- uncountable/types/integrations_t.py +62 -0
- uncountable/types/job_definition.py +28 -0
- uncountable/types/job_definition_t.py +285 -0
- uncountable/types/listing.py +9 -0
- uncountable/types/listing_t.py +51 -0
- uncountable/types/notices.py +8 -0
- uncountable/types/notices_t.py +37 -0
- uncountable/types/notifications.py +11 -0
- uncountable/types/notifications_t.py +74 -0
- uncountable/types/outputs.py +3 -22
- uncountable/types/outputs_t.py +29 -0
- uncountable/types/overrides.py +9 -0
- uncountable/types/overrides_t.py +49 -0
- uncountable/types/permissions.py +3 -42
- uncountable/types/permissions_t.py +45 -0
- uncountable/types/phases.py +3 -19
- uncountable/types/phases_t.py +26 -0
- uncountable/types/post_base.py +3 -26
- uncountable/types/post_base_t.py +29 -0
- uncountable/types/queued_job.py +17 -0
- uncountable/types/queued_job_t.py +140 -0
- uncountable/types/recipe_identifiers.py +7 -58
- uncountable/types/recipe_identifiers_t.py +75 -0
- uncountable/types/recipe_inputs.py +4 -26
- uncountable/types/recipe_inputs_t.py +29 -0
- uncountable/types/recipe_links.py +4 -46
- uncountable/types/recipe_links_t.py +53 -0
- uncountable/types/recipe_metadata.py +5 -48
- uncountable/types/recipe_metadata_t.py +57 -0
- uncountable/types/recipe_output_metadata.py +3 -20
- uncountable/types/recipe_output_metadata_t.py +27 -0
- uncountable/types/recipe_tags.py +3 -19
- uncountable/types/recipe_tags_t.py +26 -0
- uncountable/types/recipe_workflow_steps.py +9 -73
- uncountable/types/recipe_workflow_steps_t.py +95 -0
- uncountable/types/recipes.py +7 -0
- uncountable/types/recipes_t.py +25 -0
- uncountable/types/response.py +3 -21
- uncountable/types/response_t.py +26 -0
- uncountable/types/secret_retrieval.py +11 -0
- uncountable/types/secret_retrieval_t.py +75 -0
- uncountable/types/sockets.py +20 -0
- uncountable/types/sockets_t.py +169 -0
- uncountable/types/structured_filters.py +25 -0
- uncountable/types/structured_filters_t.py +248 -0
- uncountable/types/units.py +3 -19
- uncountable/types/units_t.py +26 -0
- uncountable/types/uploader.py +24 -0
- uncountable/types/uploader_t.py +222 -0
- uncountable/types/users.py +3 -20
- uncountable/types/users_t.py +27 -0
- uncountable/types/webhook_job.py +9 -0
- uncountable/types/webhook_job_t.py +48 -0
- uncountable/types/workflows.py +4 -28
- uncountable/types/workflows_t.py +38 -0
- uncountablepythonsdk-0.0.131.dist-info/METADATA +64 -0
- uncountablepythonsdk-0.0.131.dist-info/RECORD +363 -0
- {UncountablePythonSDK-0.0.24.dist-info → uncountablepythonsdk-0.0.131.dist-info}/WHEEL +1 -1
- {UncountablePythonSDK-0.0.24.dist-info → uncountablepythonsdk-0.0.131.dist-info}/top_level.txt +0 -1
- UncountablePythonSDK-0.0.24.dist-info/METADATA +0 -47
- UncountablePythonSDK-0.0.24.dist-info/RECORD +0 -216
- docs/quickstart.md +0 -19
- examples/recipe-import/importer.py +0 -39
- type_spec/external/api/batch/execute_batch.yaml +0 -56
- type_spec/external/api/batch/execute_batch_load_async.yaml +0 -18
- type_spec/external/api/chemical/convert_chemical_formats.yaml +0 -33
- type_spec/external/api/entity/create_entities.yaml +0 -45
- type_spec/external/api/entity/create_entity.yaml +0 -51
- type_spec/external/api/entity/get_entities_data.yaml +0 -29
- type_spec/external/api/entity/list_entities.yaml +0 -52
- type_spec/external/api/entity/resolve_entity_ids.yaml +0 -29
- type_spec/external/api/entity/set_values.yaml +0 -18
- type_spec/external/api/entity/transition_entity_phase.yaml +0 -44
- type_spec/external/api/id_source/list_id_source.yaml +0 -35
- type_spec/external/api/id_source/match_id_source.yaml +0 -32
- type_spec/external/api/input_groups/get_input_group_names.yaml +0 -29
- type_spec/external/api/inputs/create_inputs.yaml +0 -48
- type_spec/external/api/inputs/get_input_data.yaml +0 -95
- type_spec/external/api/inputs/get_input_names.yaml +0 -38
- type_spec/external/api/inputs/get_inputs_data.yaml +0 -82
- type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -33
- type_spec/external/api/outputs/get_output_data.yaml +0 -92
- type_spec/external/api/outputs/get_output_names.yaml +0 -35
- type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -50
- type_spec/external/api/permissions/set_core_permissions.yaml +0 -69
- type_spec/external/api/project/get_projects.yaml +0 -42
- type_spec/external/api/project/get_projects_data.yaml +0 -50
- type_spec/external/api/recipe_links/create_recipe_link.yaml +0 -25
- type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -41
- type_spec/external/api/recipes/archive_recipes.yaml +0 -20
- type_spec/external/api/recipes/associate_recipe_as_input.yaml +0 -19
- type_spec/external/api/recipes/associate_recipe_as_lot.yaml +0 -19
- type_spec/external/api/recipes/create_recipe.yaml +0 -39
- type_spec/external/api/recipes/create_recipes.yaml +0 -47
- type_spec/external/api/recipes/disassociate_recipe_as_input.yaml +0 -16
- type_spec/external/api/recipes/edit_recipe_inputs.yaml +0 -85
- type_spec/external/api/recipes/get_curve.yaml +0 -21
- type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -39
- type_spec/external/api/recipes/get_recipe_links.yaml +0 -26
- type_spec/external/api/recipes/get_recipe_names.yaml +0 -29
- type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -36
- type_spec/external/api/recipes/get_recipes_data.yaml +0 -244
- type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -42
- type_spec/external/api/recipes/set_recipe_metadata.yaml +0 -20
- type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -52
- type_spec/external/api/recipes/set_recipe_tags.yaml +0 -62
- type_spec/external/api/triggers/run_trigger.yaml +0 -18
- uncountable/integration/types.py +0 -89
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
2
|
+
# ruff: noqa: E402 Q003
|
|
3
|
+
# fmt: off
|
|
4
|
+
# isort: skip_file
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
import typing # noqa: F401
|
|
7
|
+
import datetime # noqa: F401
|
|
8
|
+
from decimal import Decimal # noqa: F401
|
|
9
|
+
from enum import StrEnum
|
|
10
|
+
import dataclasses
|
|
11
|
+
from pkgs.serialization import serial_class
|
|
12
|
+
from pkgs.serialization import serial_union_annotation
|
|
13
|
+
from . import base_t
|
|
14
|
+
|
|
15
|
+
__all__: list[str] = [
|
|
16
|
+
"BaseData",
|
|
17
|
+
"Channel",
|
|
18
|
+
"ChannelType",
|
|
19
|
+
"DataChannel",
|
|
20
|
+
"DecimalValue",
|
|
21
|
+
"HeaderEntry",
|
|
22
|
+
"HeaderType",
|
|
23
|
+
"HeaderValue",
|
|
24
|
+
"NumericChannelData",
|
|
25
|
+
"NumericHeaderData",
|
|
26
|
+
"ParsedFileData",
|
|
27
|
+
"StringValue",
|
|
28
|
+
"StructureElement",
|
|
29
|
+
"StructureElementBase",
|
|
30
|
+
"StructureElementType",
|
|
31
|
+
"TextChannelData",
|
|
32
|
+
"TextHeaderData",
|
|
33
|
+
"TimestampChannelData",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
38
|
+
class HeaderType(StrEnum):
|
|
39
|
+
NUMERIC_HEADER = "numeric_header"
|
|
40
|
+
TEXT_HEADER = "text_header"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
44
|
+
class ChannelType(StrEnum):
|
|
45
|
+
NUMERIC_CHANNEL = "numeric_channel"
|
|
46
|
+
TIMESTAMP_CHANNEL = "timestamp_channel"
|
|
47
|
+
TEXT_CHANNEL = "text_channel"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
51
|
+
class StructureElementType(StrEnum):
|
|
52
|
+
CHANNEL = "channel"
|
|
53
|
+
HEADER = "header"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
57
|
+
@serial_class(
|
|
58
|
+
named_type_path="sdk.uploader.StructureElementBase",
|
|
59
|
+
)
|
|
60
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
61
|
+
class StructureElementBase:
|
|
62
|
+
type: StructureElementType
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
66
|
+
@serial_class(
|
|
67
|
+
named_type_path="sdk.uploader.DecimalValue",
|
|
68
|
+
to_string_values={"value"},
|
|
69
|
+
)
|
|
70
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
71
|
+
class DecimalValue:
|
|
72
|
+
value: Decimal
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
76
|
+
@serial_class(
|
|
77
|
+
named_type_path="sdk.uploader.StringValue",
|
|
78
|
+
)
|
|
79
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
80
|
+
class StringValue:
|
|
81
|
+
value: str
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
85
|
+
@serial_class(
|
|
86
|
+
named_type_path="sdk.uploader.BaseData",
|
|
87
|
+
)
|
|
88
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
89
|
+
class BaseData:
|
|
90
|
+
name: str
|
|
91
|
+
type: str
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
95
|
+
@serial_class(
|
|
96
|
+
named_type_path="sdk.uploader.NumericHeaderData",
|
|
97
|
+
parse_require={"type"},
|
|
98
|
+
)
|
|
99
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
100
|
+
class NumericHeaderData(BaseData):
|
|
101
|
+
type: typing.Literal[HeaderType.NUMERIC_HEADER] = HeaderType.NUMERIC_HEADER
|
|
102
|
+
data: DecimalValue | None
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
106
|
+
@serial_class(
|
|
107
|
+
named_type_path="sdk.uploader.TextHeaderData",
|
|
108
|
+
parse_require={"type"},
|
|
109
|
+
)
|
|
110
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
111
|
+
class TextHeaderData(BaseData):
|
|
112
|
+
type: typing.Literal[HeaderType.TEXT_HEADER] = HeaderType.TEXT_HEADER
|
|
113
|
+
data: StringValue | None
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
117
|
+
HeaderValue = typing.Annotated[
|
|
118
|
+
NumericHeaderData | TextHeaderData,
|
|
119
|
+
serial_union_annotation(
|
|
120
|
+
named_type_path="sdk.uploader.HeaderValue",
|
|
121
|
+
discriminator="type",
|
|
122
|
+
discriminator_map={
|
|
123
|
+
"numeric_header": NumericHeaderData,
|
|
124
|
+
"text_header": TextHeaderData,
|
|
125
|
+
},
|
|
126
|
+
),
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
131
|
+
@serial_class(
|
|
132
|
+
named_type_path="sdk.uploader.NumericChannelData",
|
|
133
|
+
parse_require={"type"},
|
|
134
|
+
)
|
|
135
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
136
|
+
class NumericChannelData(BaseData):
|
|
137
|
+
type: typing.Literal[ChannelType.NUMERIC_CHANNEL] = ChannelType.NUMERIC_CHANNEL
|
|
138
|
+
data: list[DecimalValue]
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
142
|
+
@serial_class(
|
|
143
|
+
named_type_path="sdk.uploader.TimestampChannelData",
|
|
144
|
+
parse_require={"type"},
|
|
145
|
+
)
|
|
146
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
147
|
+
class TimestampChannelData(BaseData):
|
|
148
|
+
type: typing.Literal[ChannelType.TIMESTAMP_CHANNEL] = ChannelType.TIMESTAMP_CHANNEL
|
|
149
|
+
data: list[DecimalValue]
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
153
|
+
@serial_class(
|
|
154
|
+
named_type_path="sdk.uploader.TextChannelData",
|
|
155
|
+
parse_require={"type"},
|
|
156
|
+
)
|
|
157
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
158
|
+
class TextChannelData(BaseData):
|
|
159
|
+
type: typing.Literal[ChannelType.TEXT_CHANNEL] = ChannelType.TEXT_CHANNEL
|
|
160
|
+
data: list[StringValue]
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
164
|
+
Channel = typing.Annotated[
|
|
165
|
+
TextChannelData | TimestampChannelData | NumericChannelData,
|
|
166
|
+
serial_union_annotation(
|
|
167
|
+
named_type_path="sdk.uploader.Channel",
|
|
168
|
+
discriminator="type",
|
|
169
|
+
discriminator_map={
|
|
170
|
+
"text_channel": TextChannelData,
|
|
171
|
+
"timestamp_channel": TimestampChannelData,
|
|
172
|
+
"numeric_channel": NumericChannelData,
|
|
173
|
+
},
|
|
174
|
+
),
|
|
175
|
+
]
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
179
|
+
@serial_class(
|
|
180
|
+
named_type_path="sdk.uploader.DataChannel",
|
|
181
|
+
parse_require={"type"},
|
|
182
|
+
)
|
|
183
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
184
|
+
class DataChannel(StructureElementBase):
|
|
185
|
+
type: typing.Literal[StructureElementType.CHANNEL] = StructureElementType.CHANNEL
|
|
186
|
+
channel: Channel
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
190
|
+
@serial_class(
|
|
191
|
+
named_type_path="sdk.uploader.HeaderEntry",
|
|
192
|
+
parse_require={"type"},
|
|
193
|
+
)
|
|
194
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
195
|
+
class HeaderEntry(StructureElementBase):
|
|
196
|
+
type: typing.Literal[StructureElementType.HEADER] = StructureElementType.HEADER
|
|
197
|
+
value: HeaderValue
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
201
|
+
StructureElement = typing.Annotated[
|
|
202
|
+
DataChannel | HeaderEntry,
|
|
203
|
+
serial_union_annotation(
|
|
204
|
+
named_type_path="sdk.uploader.StructureElement",
|
|
205
|
+
discriminator="type",
|
|
206
|
+
discriminator_map={
|
|
207
|
+
"channel": DataChannel,
|
|
208
|
+
"header": HeaderEntry,
|
|
209
|
+
},
|
|
210
|
+
),
|
|
211
|
+
]
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
215
|
+
@serial_class(
|
|
216
|
+
named_type_path="sdk.uploader.ParsedFileData",
|
|
217
|
+
)
|
|
218
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
219
|
+
class ParsedFileData:
|
|
220
|
+
file_name: str
|
|
221
|
+
file_structures: list[StructureElement]
|
|
222
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
uncountable/types/users.py
CHANGED
|
@@ -1,24 +1,7 @@
|
|
|
1
|
-
#
|
|
2
|
-
# flake8: noqa: F821
|
|
3
|
-
# ruff: noqa: E402
|
|
1
|
+
# ruff: noqa: E402 Q003
|
|
4
2
|
# fmt: off
|
|
5
3
|
# isort: skip_file
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
import typing # noqa: F401
|
|
8
|
-
import datetime # noqa: F401
|
|
9
|
-
from decimal import Decimal # noqa: F401
|
|
10
|
-
from dataclasses import dataclass
|
|
11
|
-
from . import base as base_t
|
|
12
|
-
|
|
13
|
-
__all__: list[str] = [
|
|
14
|
-
"SimpleUser",
|
|
15
|
-
]
|
|
16
|
-
|
|
17
|
-
|
|
18
4
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
user_id: base_t.ObjectId
|
|
22
|
-
display_name: str
|
|
23
|
-
email: str
|
|
5
|
+
# Kept only for SDK backwards compatibility
|
|
6
|
+
from .users_t import SimpleUser as SimpleUser
|
|
24
7
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
2
|
+
# ruff: noqa: E402 Q003
|
|
3
|
+
# fmt: off
|
|
4
|
+
# isort: skip_file
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
import typing # noqa: F401
|
|
7
|
+
import datetime # noqa: F401
|
|
8
|
+
from decimal import Decimal # noqa: F401
|
|
9
|
+
import dataclasses
|
|
10
|
+
from pkgs.serialization import serial_class
|
|
11
|
+
from . import base_t
|
|
12
|
+
|
|
13
|
+
__all__: list[str] = [
|
|
14
|
+
"SimpleUser",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
19
|
+
@serial_class(
|
|
20
|
+
named_type_path="sdk.users.SimpleUser",
|
|
21
|
+
)
|
|
22
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
23
|
+
class SimpleUser:
|
|
24
|
+
user_id: base_t.ObjectId
|
|
25
|
+
display_name: str
|
|
26
|
+
email: str
|
|
27
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# ruff: noqa: E402 Q003
|
|
2
|
+
# fmt: off
|
|
3
|
+
# isort: skip_file
|
|
4
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
5
|
+
# Kept only for SDK backwards compatibility
|
|
6
|
+
from .webhook_job_t import WebhookEventPayload as WebhookEventPayload
|
|
7
|
+
from .webhook_job_t import WebhookEventBody as WebhookEventBody
|
|
8
|
+
from .webhook_job_t import RunsheetWebhookPayload as RunsheetWebhookPayload
|
|
9
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
2
|
+
# ruff: noqa: E402 Q003
|
|
3
|
+
# fmt: off
|
|
4
|
+
# isort: skip_file
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
import typing # noqa: F401
|
|
7
|
+
import datetime # noqa: F401
|
|
8
|
+
from decimal import Decimal # noqa: F401
|
|
9
|
+
import dataclasses
|
|
10
|
+
from pkgs.serialization import serial_class
|
|
11
|
+
from . import base_t
|
|
12
|
+
from . import entity_t
|
|
13
|
+
|
|
14
|
+
__all__: list[str] = [
|
|
15
|
+
"RunsheetWebhookPayload",
|
|
16
|
+
"WebhookEventBody",
|
|
17
|
+
"WebhookEventPayload",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
22
|
+
@serial_class(
|
|
23
|
+
named_type_path="sdk.webhook_job.WebhookEventPayload",
|
|
24
|
+
unconverted_values={"data"},
|
|
25
|
+
)
|
|
26
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
27
|
+
class WebhookEventPayload:
|
|
28
|
+
data: dict[str, base_t.JsonValue]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
32
|
+
@serial_class(
|
|
33
|
+
named_type_path="sdk.webhook_job.WebhookEventBody",
|
|
34
|
+
)
|
|
35
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
36
|
+
class WebhookEventBody(WebhookEventPayload):
|
|
37
|
+
event_id: str
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
41
|
+
@serial_class(
|
|
42
|
+
named_type_path="sdk.webhook_job.RunsheetWebhookPayload",
|
|
43
|
+
)
|
|
44
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
45
|
+
class RunsheetWebhookPayload:
|
|
46
|
+
entities: list[entity_t.Entity]
|
|
47
|
+
async_job_id: base_t.ObjectId
|
|
48
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
uncountable/types/workflows.py
CHANGED
|
@@ -1,32 +1,8 @@
|
|
|
1
|
-
#
|
|
2
|
-
# flake8: noqa: F821
|
|
3
|
-
# ruff: noqa: E402
|
|
1
|
+
# ruff: noqa: E402 Q003
|
|
4
2
|
# fmt: off
|
|
5
3
|
# isort: skip_file
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
import typing # noqa: F401
|
|
8
|
-
import datetime # noqa: F401
|
|
9
|
-
from decimal import Decimal # noqa: F401
|
|
10
|
-
from dataclasses import dataclass
|
|
11
|
-
from . import base as base_t
|
|
12
|
-
|
|
13
|
-
__all__: list[str] = [
|
|
14
|
-
"SimpleWorkflow",
|
|
15
|
-
"SimpleWorkflowStep",
|
|
16
|
-
]
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# DO NOT MODIFY -- This file is generated by type_spec
|
|
20
|
-
@dataclass(kw_only=True)
|
|
21
|
-
class SimpleWorkflowStep:
|
|
22
|
-
workflow_step_id: base_t.ObjectId
|
|
23
|
-
name: typing.Optional[str]
|
|
24
|
-
|
|
25
|
-
|
|
26
4
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
name: str
|
|
31
|
-
workflow_steps: list[SimpleWorkflowStep]
|
|
5
|
+
# Kept only for SDK backwards compatibility
|
|
6
|
+
from .workflows_t import SimpleWorkflowStep as SimpleWorkflowStep
|
|
7
|
+
from .workflows_t import SimpleWorkflow as SimpleWorkflow
|
|
32
8
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
2
|
+
# ruff: noqa: E402 Q003
|
|
3
|
+
# fmt: off
|
|
4
|
+
# isort: skip_file
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
import typing # noqa: F401
|
|
7
|
+
import datetime # noqa: F401
|
|
8
|
+
from decimal import Decimal # noqa: F401
|
|
9
|
+
import dataclasses
|
|
10
|
+
from pkgs.serialization import serial_class
|
|
11
|
+
from . import base_t
|
|
12
|
+
|
|
13
|
+
__all__: list[str] = [
|
|
14
|
+
"SimpleWorkflow",
|
|
15
|
+
"SimpleWorkflowStep",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
20
|
+
@serial_class(
|
|
21
|
+
named_type_path="sdk.workflows.SimpleWorkflowStep",
|
|
22
|
+
)
|
|
23
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
24
|
+
class SimpleWorkflowStep:
|
|
25
|
+
workflow_step_id: base_t.ObjectId
|
|
26
|
+
name: str | None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
30
|
+
@serial_class(
|
|
31
|
+
named_type_path="sdk.workflows.SimpleWorkflow",
|
|
32
|
+
)
|
|
33
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
34
|
+
class SimpleWorkflow:
|
|
35
|
+
workflow_id: base_t.ObjectId
|
|
36
|
+
name: str
|
|
37
|
+
workflow_steps: list[SimpleWorkflowStep]
|
|
38
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: UncountablePythonSDK
|
|
3
|
+
Version: 0.0.131
|
|
4
|
+
Summary: Uncountable SDK
|
|
5
|
+
Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
|
|
6
|
+
Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
|
|
7
|
+
Project-URL: Issues, https://github.com/uncountableinc/uncountable-python-sdk/issues
|
|
8
|
+
Keywords: uncountable,sdk,api,uncountable-sdk
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Topic :: Software Development
|
|
15
|
+
Classifier: Topic :: Utilities
|
|
16
|
+
Classifier: Typing :: Typed
|
|
17
|
+
Requires-Python: >=3.11
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
Requires-Dist: aiotus==1.*
|
|
20
|
+
Requires-Dist: aiohttp==3.*
|
|
21
|
+
Requires-Dist: requests==2.*
|
|
22
|
+
Requires-Dist: SQLAlchemy>=1.4.0
|
|
23
|
+
Requires-Dist: APScheduler==3.*
|
|
24
|
+
Requires-Dist: python-dateutil==2.*
|
|
25
|
+
Requires-Dist: shelljob==0.*
|
|
26
|
+
Requires-Dist: PyYAML==6.*
|
|
27
|
+
Requires-Dist: google-api-python-client==2.*
|
|
28
|
+
Requires-Dist: tqdm==4.*
|
|
29
|
+
Requires-Dist: pysftp==0.*
|
|
30
|
+
Requires-Dist: opentelemetry-api==1.*
|
|
31
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.*
|
|
32
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.*
|
|
33
|
+
Requires-Dist: opentelemetry-sdk==1.*
|
|
34
|
+
Requires-Dist: paramiko==3.*
|
|
35
|
+
Requires-Dist: boto3==1.*
|
|
36
|
+
Requires-Dist: flask==3.*
|
|
37
|
+
Requires-Dist: simplejson==3.*
|
|
38
|
+
Requires-Dist: grpcio==1.67.1
|
|
39
|
+
Requires-Dist: protobuf>=4.21.1
|
|
40
|
+
Requires-Dist: azure-storage-blob==12.*
|
|
41
|
+
Requires-Dist: boto3-stubs[essential,ses]==1.*
|
|
42
|
+
Requires-Dist: msgspec==0.19.*
|
|
43
|
+
Requires-Dist: tabulate==0.9.0
|
|
44
|
+
Provides-Extra: test
|
|
45
|
+
Requires-Dist: mypy==1.*; extra == "test"
|
|
46
|
+
Requires-Dist: ruff==0.*; extra == "test"
|
|
47
|
+
Requires-Dist: pytest==8.*; extra == "test"
|
|
48
|
+
Requires-Dist: coverage[toml]==7.*; extra == "test"
|
|
49
|
+
Requires-Dist: pytest-cov==6.*; extra == "test"
|
|
50
|
+
Requires-Dist: pytest-xdist==3.*; extra == "test"
|
|
51
|
+
|
|
52
|
+
# Uncountable Python SDK
|
|
53
|
+
|
|
54
|
+
## Documentation
|
|
55
|
+
[https://uncountableinc.github.io/uncountable-python-sdk/](https://uncountableinc.github.io/uncountable-python-sdk/)
|
|
56
|
+
|
|
57
|
+
## Installation
|
|
58
|
+
|
|
59
|
+
Install from PyPI:
|
|
60
|
+
|
|
61
|
+
```console
|
|
62
|
+
pip install UncountablePythonSDK
|
|
63
|
+
```
|
|
64
|
+
|