UncountablePythonSDK 0.0.162__tar.gz → 0.0.164__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.
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/.github/workflows/documentation.yml +1 -1
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/.github/workflows/publish.yml +1 -1
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/SOURCES.txt +4 -0
- uncountablepythonsdk-0.0.164/docs/integration_examples/add_file_to_folder.md +57 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/integration_examples/index.md +1 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/pyproject.toml +1 -1
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/__init__.py +4 -3
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/argument_parser.py +71 -37
- uncountablepythonsdk-0.0.164/pkgs/argument_parser/parser_error.py +95 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/client.py +3 -4
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/column.py +1 -1
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/construct_client.py +13 -19
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/command_server.py +11 -7
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +10 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/datastore/model.py +5 -1
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/worker.py +12 -1
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/__init__.py +2 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_batch_processor.py +8 -8
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/client_base.py +16 -16
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/entity_t.py +8 -0
- uncountablepythonsdk-0.0.164/uncountable/types/request_headers.py +9 -0
- uncountablepythonsdk-0.0.164/uncountable/types/request_headers_t.py +33 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/.gitignore +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/.python-version +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/README.md +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/requires.txt +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/.gitignore +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/conf.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/index.md +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/integration_examples/create_ingredient.md +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/integration_examples/create_output.md +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/integration_examples/upload_file.md +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/justfile +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/requirements.txt +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/android-chrome-192x192.png +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/android-chrome-512x512.png +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/apple-touch-icon.png +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/browserconfig.xml +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/favicon-16x16.png +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/favicon-32x32.png +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/manifest.json +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/mstile-150x150.png +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/safari-pinned-tab.svg +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/logo_blue.png +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/async_batch_large_parse.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/basic_auth.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/create_ingredient_sdk.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/download_files.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/oauth.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/set_input_pdf_attribute.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/set_recipe_metadata_file.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/set_recipe_output_file_sdk.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/upload_files.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/_is_enum.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/_is_namedtuple.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/case_convert.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_blob_session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_file_share_session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_local_session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_s3_session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_sftp_session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/file_type_utils.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/filesystem_session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/py.typed +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/annotation.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/missing_sentry.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/opaque_key.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/serial_alias.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/serial_class.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/serial_generic.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/serial_union.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/unknown.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/yaml.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/dataclasses.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/serialization_helpers.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/strenum_compat/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/strenum_compat/strenum_compat.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/actions_registry/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/actions_registry/__main__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/builder.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/builder_types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/config.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/cross_output_links.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_io_ts.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_open_api.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_typescript_util.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/load_types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/parts/base.py.prepart +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/parts/base.ts.prepart +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/test.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/type_info/__main__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/util.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/convert_type.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pyproject.toml +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/setup.cfg +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/environment.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/file_upload.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/builder.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/row.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/cli.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/cron.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/db/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/db/connect.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/db/session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/executors/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/executors/executors.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/executors/generic_upload_executor.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/executors/script_executor.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/http_server/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/http_server/types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/job.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/queue_runner.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/request_context.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/scan_profiles.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/scheduler.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/secret_retrieval/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/server.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/telemetry.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/webhook_server/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/py.typed +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/batch/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/batch/execute_batch.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/chemical/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/condition_parameters/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/create_entities.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/export_entities.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/get_entities_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/list_aggregate.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/list_entities.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/lock_entity.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/lookup_entity.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/set_barcode.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/set_values.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/unlock_entity.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/equipment/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/field_options/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/file_folders/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/file_folders/add_file_to_folder.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/files/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/files/download_file.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/id_source/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/id_source/list_id_source.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/id_source/match_id_source.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/input_groups/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/create_inputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/get_input_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/get_input_names.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/set_input_category.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/integrations/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/integrations/push_notification.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/listing/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/listing/export_listing.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/listing/fetch_listing.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/material_families/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/notebooks/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/get_output_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/get_output_names.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/get_output_organization.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/permissions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/project/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/project/get_projects.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/project/get_projects_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_links/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/archive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/create_mix_order.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/create_recipe.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/create_recipes.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_curve.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/lock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/upsert_step_relationships.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/runsheet/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/triggers/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/triggers/run_trigger.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/uploader/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/user/__init__.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/user/get_current_user_info.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_batch_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_jobs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_jobs_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/auth_retrieval.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/auth_retrieval_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/base.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/base_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/calculations.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/calculations_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/chemical_structure.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/chemical_structure_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/client_config.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/client_config_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/curves.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/curves_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/data.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/data_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/entity.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/experiment_groups.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/experiment_groups_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/exports.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/exports_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/field_values.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/field_values_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/fields.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/fields_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/generic_upload.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/generic_upload_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/id_source.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/id_source_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/identifier.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/identifier_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/input_attributes.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/input_attributes_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/inputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integration_server.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integration_server_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integration_session.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integration_session_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integrations.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integrations_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/job_definition.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/job_definition_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/listing.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/listing_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/notices.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/notices_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/notifications.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/notifications_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/outputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/outputs_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/overrides.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/overrides_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/permissions.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/permissions_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/phases.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/phases_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/post_base.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/post_base_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/queued_job.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/queued_job_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_identifiers.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_identifiers_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_links_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_output_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_step_relationships.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_step_relationships_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_tags_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_workflow_step_types.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_workflow_step_types_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_workflow_steps.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_workflow_steps_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipes.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipes_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/response.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/response_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/runsheet.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/runsheet_format.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/runsheet_format_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/runsheet_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/secret_retrieval.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/secret_retrieval_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/sockets.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/sockets_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/specs.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/specs_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/step_relationships.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/step_relationships_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/units.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/units_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/uploader.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/uploader_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/users.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/users_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/webhook_job.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/webhook_job_t.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/workflows.py +0 -0
- {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/workflows_t.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: UncountablePythonSDK
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.164
|
|
4
4
|
Summary: Uncountable SDK
|
|
5
5
|
Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
|
{uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: UncountablePythonSDK
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.164
|
|
4
4
|
Summary: Uncountable SDK
|
|
5
5
|
Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
|
|
@@ -14,6 +14,7 @@ docs/conf.py
|
|
|
14
14
|
docs/index.md
|
|
15
15
|
docs/justfile
|
|
16
16
|
docs/requirements.txt
|
|
17
|
+
docs/integration_examples/add_file_to_folder.md
|
|
17
18
|
docs/integration_examples/create_ingredient.md
|
|
18
19
|
docs/integration_examples/create_output.md
|
|
19
20
|
docs/integration_examples/index.md
|
|
@@ -58,6 +59,7 @@ pkgs/argument_parser/_is_enum.py
|
|
|
58
59
|
pkgs/argument_parser/_is_namedtuple.py
|
|
59
60
|
pkgs/argument_parser/argument_parser.py
|
|
60
61
|
pkgs/argument_parser/case_convert.py
|
|
62
|
+
pkgs/argument_parser/parser_error.py
|
|
61
63
|
pkgs/filesystem_utils/__init__.py
|
|
62
64
|
pkgs/filesystem_utils/_blob_session.py
|
|
63
65
|
pkgs/filesystem_utils/_file_share_session.py
|
|
@@ -257,6 +259,8 @@ uncountable/types/recipe_workflow_steps.py
|
|
|
257
259
|
uncountable/types/recipe_workflow_steps_t.py
|
|
258
260
|
uncountable/types/recipes.py
|
|
259
261
|
uncountable/types/recipes_t.py
|
|
262
|
+
uncountable/types/request_headers.py
|
|
263
|
+
uncountable/types/request_headers_t.py
|
|
260
264
|
uncountable/types/response.py
|
|
261
265
|
uncountable/types/response_t.py
|
|
262
266
|
uncountable/types/runsheet.py
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Add a File to a Folder
|
|
2
|
+
|
|
3
|
+
This is a two-step workflow: first upload the file using `upload_files`, then place it in a target folder using `add_file_to_folder`.
|
|
4
|
+
|
|
5
|
+
## Step 1: Upload the file
|
|
6
|
+
|
|
7
|
+
```{code-block} python
|
|
8
|
+
from io import BytesIO
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from uncountable.core import AuthDetailsApiKey, Client
|
|
12
|
+
from uncountable.core.client import ClientConfig
|
|
13
|
+
from uncountable.core.file_upload import DataFileUpload, UploadedFile
|
|
14
|
+
|
|
15
|
+
client: Client = Client(
|
|
16
|
+
base_url="<BASE_URL>",
|
|
17
|
+
auth_details=AuthDetailsApiKey(
|
|
18
|
+
api_id="<API_ID>", api_secret_key="<API_SECRET_KEY>"
|
|
19
|
+
),
|
|
20
|
+
config=ClientConfig(allow_insecure_tls=False),
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
filepath = Path("<YOUR_FILE_PATH>")
|
|
24
|
+
file_io: BytesIO = BytesIO(filepath.read_bytes())
|
|
25
|
+
|
|
26
|
+
upload_file_response: list[UploadedFile] = client.upload_files(
|
|
27
|
+
file_uploads=[DataFileUpload(data=file_io, name=filepath.name)]
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
file_id = upload_file_response[0].file_id
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Step 2: Add the file to a folder
|
|
34
|
+
|
|
35
|
+
```{code-block} python
|
|
36
|
+
from uncountable.types import identifier_t
|
|
37
|
+
|
|
38
|
+
response = client.add_file_to_folder(
|
|
39
|
+
file_id=file_id,
|
|
40
|
+
folder_key=identifier_t.IdentifierKeyId(id=<FOLDER_ID>),
|
|
41
|
+
)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Example Response:
|
|
45
|
+
```{code}
|
|
46
|
+
Data(modification_made=True, result_id=4521, entity=Entity(id=892, type=<EntityType.FILE_FOLDER_MEMBERSHIP: 'file_folder_membership'>), result_values=None)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
To add the file to the root folder instead of a specific folder:
|
|
50
|
+
|
|
51
|
+
```{code-block} python
|
|
52
|
+
response = client.add_file_to_folder(
|
|
53
|
+
file_id=file_id,
|
|
54
|
+
folder_key=identifier_t.IdentifierKeyRefName(ref_name="root"),
|
|
55
|
+
)
|
|
56
|
+
```
|
|
57
|
+
|
{uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/__init__.py
RENAMED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
from ._is_enum import is_string_enum_class as is_string_enum_class
|
|
2
2
|
from .argument_parser import CachedParser as CachedParser
|
|
3
3
|
from .argument_parser import ParserBase as ParserBase
|
|
4
|
-
from .argument_parser import ParserError as ParserError
|
|
5
|
-
from .argument_parser import ParserExtraFieldsError as ParserExtraFieldsError
|
|
6
4
|
from .argument_parser import ParserFunction as ParserFunction
|
|
7
5
|
from .argument_parser import ParserOptions as ParserOptions
|
|
8
|
-
from .argument_parser import ParserTypeError as ParserTypeError
|
|
9
6
|
from .argument_parser import SourceEncoding as SourceEncoding
|
|
10
7
|
from .argument_parser import build_parser as build_parser
|
|
11
8
|
from .argument_parser import is_missing as is_missing
|
|
@@ -14,3 +11,7 @@ from .argument_parser import is_union as is_union
|
|
|
14
11
|
from .case_convert import camel_to_snake_case as camel_to_snake_case
|
|
15
12
|
from .case_convert import kebab_to_pascal_case as kebab_to_pascal_case
|
|
16
13
|
from .case_convert import snake_to_camel_case as snake_to_camel_case
|
|
14
|
+
from .parser_error import ParserEnumError as ParserEnumError
|
|
15
|
+
from .parser_error import ParserError as ParserError
|
|
16
|
+
from .parser_error import ParserExtraFieldsError as ParserExtraFieldsError
|
|
17
|
+
from .parser_error import ParserTypeError as ParserTypeError
|
|
@@ -26,6 +26,12 @@ from pkgs.serialization import (
|
|
|
26
26
|
from ._is_enum import is_string_enum_class
|
|
27
27
|
from ._is_namedtuple import is_namedtuple_type
|
|
28
28
|
from .case_convert import camel_to_snake_case, snake_to_camel_case
|
|
29
|
+
from .parser_error import (
|
|
30
|
+
ParserEnumError,
|
|
31
|
+
ParserError,
|
|
32
|
+
ParserExtraFieldsError,
|
|
33
|
+
ParserTypeError,
|
|
34
|
+
)
|
|
29
35
|
|
|
30
36
|
T = typing.TypeVar("T")
|
|
31
37
|
ParserFunction = typing.Callable[[typing.Any], T]
|
|
@@ -72,22 +78,6 @@ class ParserContext:
|
|
|
72
78
|
cache: ParserCache
|
|
73
79
|
|
|
74
80
|
|
|
75
|
-
class ParserError(BaseException): ...
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
class ParserExtraFieldsError(ParserError):
|
|
79
|
-
extra_fields: set[str]
|
|
80
|
-
|
|
81
|
-
def __init__(self, extra_fields: set[str]) -> None:
|
|
82
|
-
self.extra_fields = extra_fields
|
|
83
|
-
|
|
84
|
-
def __str__(self) -> str:
|
|
85
|
-
return f"extra fields were provided: {', '.join(self.extra_fields)}"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
class ParserTypeError(ParserError): ...
|
|
89
|
-
|
|
90
|
-
|
|
91
81
|
def is_union(field_type: typing.Any) -> bool:
|
|
92
82
|
origin = typing.get_origin(field_type)
|
|
93
83
|
return origin is typing.Union or origin is types.UnionType
|
|
@@ -152,8 +142,10 @@ def _invoke_fallback_parsers(
|
|
|
152
142
|
except Exception as e:
|
|
153
143
|
exceptions.append(e)
|
|
154
144
|
continue
|
|
155
|
-
raise
|
|
156
|
-
f"Unhandled value {value} cannot be cast to a member of {original_type}"
|
|
145
|
+
raise ParserError(
|
|
146
|
+
f"Unhandled value {value} cannot be cast to a member of {original_type}",
|
|
147
|
+
value=value,
|
|
148
|
+
expected_type=original_type,
|
|
157
149
|
) from ExceptionGroup("Fallback Parser Exception", exceptions)
|
|
158
150
|
|
|
159
151
|
|
|
@@ -169,7 +161,9 @@ def _invoke_membership_parser(
|
|
|
169
161
|
if value == test_value:
|
|
170
162
|
return test_value
|
|
171
163
|
|
|
172
|
-
raise
|
|
164
|
+
raise ParserError(
|
|
165
|
+
f"Expected value from {expected_values} but got value {value}", value=value
|
|
166
|
+
)
|
|
173
167
|
|
|
174
168
|
|
|
175
169
|
# Uses `is` to compare
|
|
@@ -179,8 +173,10 @@ def _build_identity_parser(
|
|
|
179
173
|
def parse(value: typing.Any) -> T:
|
|
180
174
|
if value is identity_value:
|
|
181
175
|
return identity_value
|
|
182
|
-
raise
|
|
183
|
-
f"Expected value {identity_value} (type: {type(identity_value)}) but got value {value} (type: {type(value)})"
|
|
176
|
+
raise ParserError(
|
|
177
|
+
f"Expected value {identity_value} (type: {type(identity_value)}) but got value {value} (type: {type(value)})",
|
|
178
|
+
value=value,
|
|
179
|
+
expected_type=type(identity_value),
|
|
184
180
|
)
|
|
185
181
|
|
|
186
182
|
return parse
|
|
@@ -206,12 +202,12 @@ def _build_parser_discriminated_union(
|
|
|
206
202
|
else:
|
|
207
203
|
discriminant = value.get(discriminator)
|
|
208
204
|
if discriminant is None:
|
|
209
|
-
raise
|
|
205
|
+
raise ParserError("missing-union-discriminant")
|
|
210
206
|
if not isinstance(discriminant, str):
|
|
211
|
-
raise
|
|
207
|
+
raise ParserError("union-discriminant-is-not-string", value=discriminant)
|
|
212
208
|
parser = discriminator_map.get(discriminant)
|
|
213
209
|
if parser is None:
|
|
214
|
-
raise
|
|
210
|
+
raise ParserError("missing-type-for-union-discriminant", value=discriminant)
|
|
215
211
|
return parser(value)
|
|
216
212
|
|
|
217
213
|
return parse
|
|
@@ -384,18 +380,22 @@ def _build_parser_inner(
|
|
|
384
380
|
if origin in (list, set):
|
|
385
381
|
args = typing.get_args(parsed_type)
|
|
386
382
|
if len(args) != 1:
|
|
387
|
-
raise
|
|
383
|
+
raise ParserError(
|
|
384
|
+
"List types only support one argument", expected_type=parsed_type
|
|
385
|
+
)
|
|
388
386
|
arg_parser = _build_parser_inner(args[0], context, type_var_map)
|
|
389
387
|
|
|
390
388
|
def parse_element(value: typing.Any) -> typing.Any:
|
|
391
389
|
try:
|
|
392
390
|
return arg_parser(value)
|
|
393
391
|
except Exception as e:
|
|
394
|
-
raise
|
|
392
|
+
raise ParserError("Failed to parse element", value=value) from e
|
|
395
393
|
|
|
396
394
|
def parse(value: typing.Any) -> typing.Any:
|
|
397
395
|
if not isinstance(value, list):
|
|
398
|
-
raise
|
|
396
|
+
raise ParserError(
|
|
397
|
+
"value is not a list", value=value, expected_type=parsed_type
|
|
398
|
+
)
|
|
399
399
|
return origin(parse_element(x) for x in value)
|
|
400
400
|
|
|
401
401
|
return parse
|
|
@@ -403,7 +403,10 @@ def _build_parser_inner(
|
|
|
403
403
|
if origin is dict:
|
|
404
404
|
args = typing.get_args(parsed_type)
|
|
405
405
|
if len(args) != 2:
|
|
406
|
-
raise
|
|
406
|
+
raise ParserError(
|
|
407
|
+
"Dict types only support two arguments for now",
|
|
408
|
+
expected_type=parsed_type,
|
|
409
|
+
)
|
|
407
410
|
k_inner_parser = _build_parser_inner(
|
|
408
411
|
args[0],
|
|
409
412
|
context,
|
|
@@ -479,7 +482,11 @@ def _build_parser_inner(
|
|
|
479
482
|
return value # type: ignore
|
|
480
483
|
if isinstance(value, (float, int)):
|
|
481
484
|
return str(value) # type: ignore
|
|
482
|
-
raise
|
|
485
|
+
raise ParserError(
|
|
486
|
+
f"Invalid string value: {type(value)}: {value}",
|
|
487
|
+
value=value,
|
|
488
|
+
expected_type=str,
|
|
489
|
+
)
|
|
483
490
|
|
|
484
491
|
return parse_str
|
|
485
492
|
|
|
@@ -488,19 +495,38 @@ def _build_parser_inner(
|
|
|
488
495
|
def parse_as_numeric_type(value: typing.Any) -> T:
|
|
489
496
|
numeric_value: Decimal | float = parsed_type(value) # type: ignore
|
|
490
497
|
if math.isnan(numeric_value):
|
|
491
|
-
raise
|
|
498
|
+
raise ParserError(
|
|
499
|
+
f"Invalid numeric value: {numeric_value}",
|
|
500
|
+
value=numeric_value,
|
|
501
|
+
expected_type=parsed_type,
|
|
502
|
+
)
|
|
492
503
|
|
|
493
504
|
return numeric_value # type: ignore
|
|
494
505
|
|
|
495
506
|
return parse_as_numeric_type
|
|
496
507
|
|
|
497
|
-
if parsed_type in (dict, bool)
|
|
508
|
+
if parsed_type in (dict, bool):
|
|
498
509
|
return lambda value: parsed_type(value) # type: ignore
|
|
499
510
|
|
|
511
|
+
if is_string_enum_class(parsed_type):
|
|
512
|
+
assert issubclass(parsed_type, Enum)
|
|
513
|
+
enum_values: set[str] = set(member.value for member in parsed_type)
|
|
514
|
+
|
|
515
|
+
def parse_enum(value: typing.Any) -> T:
|
|
516
|
+
if not isinstance(value, str) or value not in enum_values:
|
|
517
|
+
raise ParserEnumError(
|
|
518
|
+
value=value,
|
|
519
|
+
enum_type=parsed_type,
|
|
520
|
+
valid_values=enum_values,
|
|
521
|
+
)
|
|
522
|
+
return parsed_type(value)
|
|
523
|
+
|
|
524
|
+
return parse_enum
|
|
525
|
+
|
|
500
526
|
if parsed_type is MissingSentryType:
|
|
501
527
|
|
|
502
528
|
def error(value: typing.Any) -> T:
|
|
503
|
-
raise
|
|
529
|
+
raise ParserError("Missing type cannot be parsed directly")
|
|
504
530
|
|
|
505
531
|
return error
|
|
506
532
|
|
|
@@ -519,7 +545,9 @@ def _build_parser_inner(
|
|
|
519
545
|
type_var_map,
|
|
520
546
|
)
|
|
521
547
|
|
|
522
|
-
raise
|
|
548
|
+
raise ParserError(
|
|
549
|
+
f"Unhandled type {parsed_type}/{origin}", expected_type=parsed_type
|
|
550
|
+
)
|
|
523
551
|
|
|
524
552
|
|
|
525
553
|
# Take in map of parameter name to materialized type
|
|
@@ -583,7 +611,9 @@ def _build_parser_dataclass(
|
|
|
583
611
|
field_value: typing.Any
|
|
584
612
|
if field_raw_value == dataclasses.MISSING:
|
|
585
613
|
if serial_class_data.has_parse_require(field.name):
|
|
586
|
-
raise
|
|
614
|
+
raise ParserError(
|
|
615
|
+
"missing-required-field", field_name=field.name
|
|
616
|
+
)
|
|
587
617
|
if _has_field_default(field):
|
|
588
618
|
field_value = _get_field_default(field)
|
|
589
619
|
elif is_missing(field_type):
|
|
@@ -596,7 +626,9 @@ def _build_parser_dataclass(
|
|
|
596
626
|
# Backwards compatibilty to dataclasses that didn't set a default value
|
|
597
627
|
field_value = False
|
|
598
628
|
else:
|
|
599
|
-
raise
|
|
629
|
+
raise ParserError(
|
|
630
|
+
"missing-value-for-field", field_name=field.name
|
|
631
|
+
)
|
|
600
632
|
elif (
|
|
601
633
|
field_raw_value is None
|
|
602
634
|
and not is_optional(field_type)
|
|
@@ -612,8 +644,10 @@ def _build_parser_dataclass(
|
|
|
612
644
|
data[field.name] = field_value
|
|
613
645
|
|
|
614
646
|
except Exception as e:
|
|
615
|
-
raise
|
|
616
|
-
f"unable-to-parse-field:{field.name}",
|
|
647
|
+
raise ParserError(
|
|
648
|
+
f"unable-to-parse-field:{field.name}",
|
|
649
|
+
field_name=field.name,
|
|
650
|
+
value=field_raw_value,
|
|
617
651
|
) from e
|
|
618
652
|
|
|
619
653
|
if context.options.strict_property_parsing:
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import reprlib
|
|
4
|
+
import typing
|
|
5
|
+
|
|
6
|
+
_UNSET = object()
|
|
7
|
+
_VALUE_REPR_MAX_LENGTH = 120
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _format_value(value: object) -> str:
|
|
11
|
+
value_repr = reprlib.Repr(
|
|
12
|
+
maxstring=_VALUE_REPR_MAX_LENGTH, maxother=_VALUE_REPR_MAX_LENGTH
|
|
13
|
+
).repr(value)
|
|
14
|
+
if len(value_repr) <= _VALUE_REPR_MAX_LENGTH:
|
|
15
|
+
return value_repr
|
|
16
|
+
return f"{value_repr[: _VALUE_REPR_MAX_LENGTH - 3]}..."
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _format_message(message: str, value: object) -> str:
|
|
20
|
+
if value is _UNSET:
|
|
21
|
+
return message
|
|
22
|
+
return f"{message} (value: {_format_value(value)})"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ParserError(ValueError):
|
|
26
|
+
"""Raised when argument parsing fails. Carries structured context about the failure."""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
message: str,
|
|
31
|
+
*,
|
|
32
|
+
value: typing.Any = _UNSET,
|
|
33
|
+
expected_type: typing.Any = None,
|
|
34
|
+
field_name: str | None = None,
|
|
35
|
+
) -> None:
|
|
36
|
+
self.error_message = message
|
|
37
|
+
self.value = value
|
|
38
|
+
self.expected_type = expected_type
|
|
39
|
+
self.field_name = field_name
|
|
40
|
+
super().__init__(message)
|
|
41
|
+
|
|
42
|
+
def __str__(self) -> str:
|
|
43
|
+
return _format_message(self.error_message, self.value)
|
|
44
|
+
|
|
45
|
+
def error_chain(self) -> list[ParserError]:
|
|
46
|
+
errors: list[ParserError] = []
|
|
47
|
+
current: BaseException | None = self
|
|
48
|
+
while isinstance(current, ParserError):
|
|
49
|
+
errors.append(current)
|
|
50
|
+
current = current.__cause__
|
|
51
|
+
return errors
|
|
52
|
+
|
|
53
|
+
def format_error_chain(self) -> str:
|
|
54
|
+
messages: list[str] = []
|
|
55
|
+
current: BaseException | None = self
|
|
56
|
+
while current is not None:
|
|
57
|
+
if isinstance(current, ParserError):
|
|
58
|
+
messages.append(_format_message(current.error_message, current.value))
|
|
59
|
+
current = current.__cause__
|
|
60
|
+
else:
|
|
61
|
+
messages.append(str(current))
|
|
62
|
+
break
|
|
63
|
+
|
|
64
|
+
if len(messages) <= 1:
|
|
65
|
+
return _format_message(self.error_message, self.value)
|
|
66
|
+
|
|
67
|
+
return " → ".join(messages)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ParserExtraFieldsError(ParserError):
|
|
71
|
+
extra_fields: set[str]
|
|
72
|
+
|
|
73
|
+
def __init__(self, extra_fields: set[str]) -> None:
|
|
74
|
+
self.extra_fields = extra_fields
|
|
75
|
+
super().__init__(
|
|
76
|
+
f"extra fields were provided: {', '.join(extra_fields)}",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class ParserEnumError(ParserError):
|
|
81
|
+
valid_values: set[str]
|
|
82
|
+
|
|
83
|
+
def __init__(
|
|
84
|
+
self,
|
|
85
|
+
*,
|
|
86
|
+
value: object,
|
|
87
|
+
enum_type: type,
|
|
88
|
+
valid_values: set[str],
|
|
89
|
+
) -> None:
|
|
90
|
+
self.valid_values = valid_values
|
|
91
|
+
message = f"'{value}' is not a valid string enum of type {enum_type.__name__}."
|
|
92
|
+
super().__init__(message, value=value, expected_type=enum_type)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class ParserTypeError(ParserError): ...
|
|
@@ -24,13 +24,12 @@ from uncountable.types import download_file_t
|
|
|
24
24
|
from uncountable.types.client_base import APIRequest, ClientMethods
|
|
25
25
|
from uncountable.types.client_config import ClientConfigOptions
|
|
26
26
|
from uncountable.types.client_config_t import RequestContext
|
|
27
|
+
from uncountable.types.request_headers_t import InternalRequestHeaders, VersionHeaders
|
|
27
28
|
|
|
28
29
|
from .file_upload import FileUpload, FileUploader, UploadedFile
|
|
29
30
|
from .types import AuthDetailsAll, AuthDetailsApiKey, AuthDetailsOAuth
|
|
30
31
|
|
|
31
32
|
DT = typing.TypeVar("DT")
|
|
32
|
-
UNC_REQUEST_ID_HEADER = "X-UNC-REQUEST-ID"
|
|
33
|
-
UNC_SDK_VERSION_HEADER = "X-UNC-SDK-VERSION"
|
|
34
33
|
|
|
35
34
|
|
|
36
35
|
class EndpointMethod(StrEnum):
|
|
@@ -328,8 +327,8 @@ class Client(ClientMethods):
|
|
|
328
327
|
self, *, api_request: APIRequest, request_id: str
|
|
329
328
|
) -> HTTPRequest:
|
|
330
329
|
headers = self._build_auth_headers()
|
|
331
|
-
headers[
|
|
332
|
-
headers[
|
|
330
|
+
headers[InternalRequestHeaders.REQUEST_ID] = request_id
|
|
331
|
+
headers[VersionHeaders.UNC_SDK_VERSION] = get_version()
|
|
333
332
|
if self._cfg.request_context is not None:
|
|
334
333
|
if self._cfg.request_context.user_locale is not None:
|
|
335
334
|
headers["X-User-Locale"] = self._cfg.request_context.user_locale
|
{uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/column.py
RENAMED
|
@@ -294,7 +294,7 @@ class BooleanColumn[
|
|
|
294
294
|
) -> ColumnFilter:
|
|
295
295
|
return ColumnFilter(
|
|
296
296
|
identifier=self.identifier,
|
|
297
|
-
filter=lambda x: listing_t.
|
|
297
|
+
filter=lambda x: listing_t.FilterSpecEqualsBoolean(column=x, value=other),
|
|
298
298
|
)
|
|
299
299
|
|
|
300
300
|
|
|
@@ -30,34 +30,28 @@ def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
|
|
|
30
30
|
return AuthDetailsApiKey(api_id=api_id, api_secret_key=api_key)
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
def _construct_client_config(
|
|
34
|
-
*,
|
|
35
|
-
profile_meta: ProfileMetadata,
|
|
36
|
-
job_logger: JobLogger,
|
|
37
|
-
request_context: RequestContext | None = None,
|
|
38
|
-
) -> ClientConfig:
|
|
39
|
-
if profile_meta.client_options is None:
|
|
40
|
-
return ClientConfig(logger=job_logger, request_context=request_context)
|
|
41
|
-
return ClientConfig(
|
|
42
|
-
allow_insecure_tls=profile_meta.client_options.allow_insecure_tls,
|
|
43
|
-
extra_headers=profile_meta.client_options.extra_headers,
|
|
44
|
-
logger=job_logger,
|
|
45
|
-
request_context=request_context,
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
|
|
49
33
|
def construct_uncountable_client(
|
|
50
34
|
profile_meta: ProfileMetadata,
|
|
51
35
|
logger: JobLogger,
|
|
52
36
|
*,
|
|
53
37
|
request_context: RequestContext | None = None,
|
|
38
|
+
headers: dict[str, str] | None = None,
|
|
54
39
|
) -> Client:
|
|
40
|
+
extra_headers = {}
|
|
41
|
+
allow_insecure_tls = False
|
|
42
|
+
if profile_meta.client_options is not None:
|
|
43
|
+
extra_headers.update(profile_meta.client_options.extra_headers or {})
|
|
44
|
+
allow_insecure_tls = profile_meta.client_options.allow_insecure_tls
|
|
45
|
+
|
|
46
|
+
extra_headers.update(headers or {})
|
|
47
|
+
|
|
55
48
|
return Client(
|
|
56
49
|
base_url=profile_meta.base_url,
|
|
57
50
|
auth_details=_construct_auth_details(profile_meta),
|
|
58
|
-
config=
|
|
59
|
-
|
|
60
|
-
|
|
51
|
+
config=ClientConfig(
|
|
52
|
+
allow_insecure_tls=allow_insecure_tls,
|
|
53
|
+
extra_headers=extra_headers,
|
|
54
|
+
logger=logger,
|
|
61
55
|
request_context=request_context,
|
|
62
56
|
),
|
|
63
57
|
app_base_url=profile_meta.app_base_url,
|
|
@@ -159,13 +159,17 @@ async def serve(command_queue: CommandQueue, datastore: DatastoreSqlite) -> None
|
|
|
159
159
|
else None
|
|
160
160
|
)
|
|
161
161
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
162
|
+
loop = asyncio.get_running_loop()
|
|
163
|
+
queued_job_metadata = await loop.run_in_executor(
|
|
164
|
+
None,
|
|
165
|
+
lambda: datastore.list_queued_job_metadata(
|
|
166
|
+
status=job_status,
|
|
167
|
+
limit=request.limit,
|
|
168
|
+
offset=request.offset,
|
|
169
|
+
job_ref_name=request.job_ref_name or None,
|
|
170
|
+
submitted_from=submitted_from,
|
|
171
|
+
submitted_to=submitted_to,
|
|
172
|
+
),
|
|
169
173
|
)
|
|
170
174
|
|
|
171
175
|
response_list: list[ListQueuedJobsResult.ListQueuedJobsResultItem] = []
|
|
@@ -36,6 +36,16 @@ class DatastoreSqlite(Datastore):
|
|
|
36
36
|
connection.execute(
|
|
37
37
|
text("alter table queued_jobs add column status VARCHAR")
|
|
38
38
|
)
|
|
39
|
+
connection.execute(
|
|
40
|
+
text(
|
|
41
|
+
"create index if not exists ix_queued_jobs_status on queued_jobs (status)"
|
|
42
|
+
)
|
|
43
|
+
)
|
|
44
|
+
connection.execute(
|
|
45
|
+
text(
|
|
46
|
+
"create index if not exists ix_queued_jobs_submitted_at on queued_jobs (submitted_at)"
|
|
47
|
+
)
|
|
48
|
+
)
|
|
39
49
|
|
|
40
50
|
def add_job_to_queue(
|
|
41
51
|
self, job_payload: queued_job_t.QueuedJobPayload, job_ref_name: str
|
|
@@ -13,7 +13,10 @@ class QueuedJob(Base):
|
|
|
13
13
|
id = Column(Text, primary_key=True)
|
|
14
14
|
job_ref_name = Column(Text, nullable=False, index=True)
|
|
15
15
|
submitted_at = Column(
|
|
16
|
-
DateTime(timezone=True),
|
|
16
|
+
DateTime(timezone=True),
|
|
17
|
+
server_default=func.current_timestamp(),
|
|
18
|
+
nullable=False,
|
|
19
|
+
index=True,
|
|
17
20
|
)
|
|
18
21
|
payload = Column(JSON, nullable=False)
|
|
19
22
|
num_attempts = Column(BigInteger, nullable=False, default=0, server_default="0")
|
|
@@ -21,4 +24,5 @@ class QueuedJob(Base):
|
|
|
21
24
|
Enum(queued_job_t.JobStatus, length=None),
|
|
22
25
|
default=queued_job_t.JobStatus.QUEUED,
|
|
23
26
|
nullable=True,
|
|
27
|
+
index=True,
|
|
24
28
|
)
|
|
@@ -23,7 +23,13 @@ from uncountable.integration.queue_runner.datastore.interface import Datastore
|
|
|
23
23
|
from uncountable.integration.queue_runner.types import ListenQueue, ResultQueue
|
|
24
24
|
from uncountable.integration.scan_profiles import load_profiles
|
|
25
25
|
from uncountable.integration.telemetry import JobLogger, Logger, get_otel_tracer
|
|
26
|
-
from uncountable.types import
|
|
26
|
+
from uncountable.types import (
|
|
27
|
+
base_t,
|
|
28
|
+
client_config_t,
|
|
29
|
+
job_definition_t,
|
|
30
|
+
queued_job_t,
|
|
31
|
+
request_headers_t,
|
|
32
|
+
)
|
|
27
33
|
|
|
28
34
|
|
|
29
35
|
class Worker:
|
|
@@ -123,6 +129,11 @@ def run_queued_job(
|
|
|
123
129
|
profile_meta=job_details.profile_metadata,
|
|
124
130
|
logger=job_logger,
|
|
125
131
|
request_context=request_context,
|
|
132
|
+
headers={
|
|
133
|
+
request_headers_t.IntegrationServerHeaders.JOB_UUID: queued_job.queued_job_uuid,
|
|
134
|
+
request_headers_t.IntegrationServerHeaders.JOB_ID: job_details.job_definition.id,
|
|
135
|
+
request_headers_t.IntegrationServerHeaders.JOB_NAME: job_details.job_definition.name,
|
|
136
|
+
},
|
|
126
137
|
)
|
|
127
138
|
batch_processor = AsyncBatchProcessor(client=client)
|
|
128
139
|
|
|
@@ -108,6 +108,7 @@ from . import recipes_t as recipes_t
|
|
|
108
108
|
from .api.integrations import register_sockets_token as register_sockets_token_t
|
|
109
109
|
from .api.recipes import remove_recipe_from_project as remove_recipe_from_project_t
|
|
110
110
|
from .api.recipe_links import remove_recipe_link as remove_recipe_link_t
|
|
111
|
+
from . import request_headers_t as request_headers_t
|
|
111
112
|
from .api.entity import resolve_entity_ids as resolve_entity_ids_t
|
|
112
113
|
from .api.outputs import resolve_output_conditions as resolve_output_conditions_t
|
|
113
114
|
from . import response_t as response_t
|
|
@@ -258,6 +259,7 @@ __all__: list[str] = [
|
|
|
258
259
|
"register_sockets_token_t",
|
|
259
260
|
"remove_recipe_from_project_t",
|
|
260
261
|
"remove_recipe_link_t",
|
|
262
|
+
"request_headers_t",
|
|
261
263
|
"resolve_entity_ids_t",
|
|
262
264
|
"resolve_output_conditions_t",
|
|
263
265
|
"response_t",
|