UncountablePythonSDK 0.0.157__tar.gz → 0.0.159__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.157 → uncountablepythonsdk-0.0.159}/.github/workflows/documentation.yml +1 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/.github/workflows/publish.yml +2 -2
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/SOURCES.txt +2 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/integration_examples/upload_file.md +1 -2
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/async_batch_large_parse.py +7 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/pyproject.toml +1 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_open_api.py +5 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/client.py +2 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/file_upload.py +30 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/column.py +106 -0
- uncountablepythonsdk-0.0.159/uncountable/core/query/types.py +12 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/construct_client.py +16 -4
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/job.py +5 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/command_client.py +1 -2
- uncountablepythonsdk-0.0.159/uncountable/integration/request_context.py +34 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/uploader/complete_async_parse.py +2 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_batch_processor.py +5 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_base.py +5 -1
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_config.py +2 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_config_t.py +36 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/queued_job_t.py +2 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/.gitignore +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/.python-version +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/README.md +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/requires.txt +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/.gitignore +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/conf.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/index.md +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/integration_examples/create_ingredient.md +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/integration_examples/create_output.md +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/integration_examples/index.md +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/justfile +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/requirements.txt +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/android-chrome-192x192.png +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/android-chrome-512x512.png +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/apple-touch-icon.png +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/browserconfig.xml +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/favicon-16x16.png +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/favicon-32x32.png +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/manifest.json +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/mstile-150x150.png +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/safari-pinned-tab.svg +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/logo_blue.png +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/basic_auth.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/create_ingredient_sdk.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/download_files.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/oauth.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/set_input_pdf_attribute.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/set_recipe_metadata_file.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/set_recipe_output_file_sdk.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/upload_files.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/_is_enum.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/_is_namedtuple.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/argument_parser.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/case_convert.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_blob_session.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_local_session.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_s3_session.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_sftp_session.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/file_type_utils.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/filesystem_session.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/py.typed +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/annotation.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/missing_sentry.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/opaque_key.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/serial_alias.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/serial_class.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/serial_generic.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/serial_union.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/unknown.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/yaml.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/dataclasses.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/serialization_helpers.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/strenum_compat/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/strenum_compat/strenum_compat.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/actions_registry/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/actions_registry/__main__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/builder.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/builder_types.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/config.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/cross_output_links.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_io_ts.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_typescript_util.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/load_types.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/parts/base.py.prepart +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/parts/base.ts.prepart +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/test.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/type_info/__main__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/util.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/convert_type.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/types.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pyproject.toml +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/setup.cfg +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/environment.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/builder.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/row.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/types.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/cli.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/cron.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/db/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/db/connect.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/db/session.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/executors/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/executors/executors.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/executors/generic_upload_executor.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/executors/script_executor.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/http_server/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/http_server/types.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/types.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/datastore/model.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/queue_runner.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/types.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/worker.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/scan_profiles.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/scheduler.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/secret_retrieval/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/server.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/telemetry.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/webhook_server/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/py.typed +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/batch/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/batch/execute_batch.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/chemical/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/condition_parameters/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/create_entities.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/export_entities.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/get_entities_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/list_aggregate.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/list_entities.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/lock_entity.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/lookup_entity.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/set_barcode.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/set_values.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/unlock_entity.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/equipment/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/field_options/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/file_folders/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/files/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/files/create_file_record.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/files/download_file.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/id_source/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/id_source/list_id_source.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/id_source/match_id_source.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/input_groups/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/create_inputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/get_input_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/get_input_names.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/set_input_category.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/integrations/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/integrations/push_notification.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/listing/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/listing/export_listing.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/listing/fetch_listing.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/material_families/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/notebooks/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/get_output_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/get_output_names.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/get_output_organization.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/permissions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/project/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/project/get_projects.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/project/get_projects_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_links/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/archive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/create_mix_order.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/create_recipe.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/create_recipes.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_curve.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/lock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/runsheet/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/triggers/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/triggers/run_trigger.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/uploader/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/user/__init__.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/user/get_current_user_info.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_batch_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_jobs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_jobs_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/auth_retrieval.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/auth_retrieval_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/base.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/base_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/calculations.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/calculations_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/chemical_structure.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/chemical_structure_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/curves.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/curves_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/data.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/data_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/entity.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/entity_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/experiment_groups.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/experiment_groups_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/exports.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/exports_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/field_values.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/field_values_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/fields.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/fields_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/generic_upload.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/generic_upload_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/id_source.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/id_source_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/identifier.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/identifier_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/input_attributes.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/input_attributes_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/inputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integration_server.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integration_server_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integration_session.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integration_session_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integrations.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integrations_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/job_definition.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/job_definition_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/listing.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/listing_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/notices.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/notices_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/notifications.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/notifications_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/outputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/outputs_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/overrides.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/overrides_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/permissions.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/permissions_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/phases.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/phases_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/post_base.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/post_base_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/queued_job.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_identifiers.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_identifiers_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_links_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_output_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_step_relationships.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_step_relationships_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_tags_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_workflow_steps.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_workflow_steps_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipes.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipes_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/response.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/response_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/runsheet.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/runsheet_format.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/runsheet_format_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/runsheet_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/secret_retrieval.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/secret_retrieval_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/sockets.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/sockets_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/specs.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/specs_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/units.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/units_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/uploader.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/uploader_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/users.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/users_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/webhook_job.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/webhook_job_t.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/workflows.py +0 -0
- {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/workflows_t.py +0 -0
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/.github/workflows/documentation.yml
RENAMED
|
@@ -9,7 +9,7 @@ jobs:
|
|
|
9
9
|
docs:
|
|
10
10
|
runs-on: ubuntu-latest
|
|
11
11
|
steps:
|
|
12
|
-
- uses: actions/checkout@
|
|
12
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
13
13
|
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6
|
|
14
14
|
- uses: extractions/setup-crate@4993624604c307fbca528d28a3c8b60fa5ecc859 # v1
|
|
15
15
|
with:
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
name: Build distribution packages
|
|
20
20
|
runs-on: ubuntu-latest
|
|
21
21
|
steps:
|
|
22
|
-
- uses: actions/checkout@
|
|
22
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
23
23
|
with:
|
|
24
24
|
fetch-depth: 0
|
|
25
25
|
tags: true
|
|
@@ -36,7 +36,7 @@ jobs:
|
|
|
36
36
|
run: |
|
|
37
37
|
export SETUPTOOLS_SCM_PRETEND_VERSION_FOR_uncountablepythonsdk=$(git describe --tags --exact-match)
|
|
38
38
|
python3 -m build
|
|
39
|
-
- uses: actions/upload-artifact@
|
|
39
|
+
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
|
|
40
40
|
with:
|
|
41
41
|
name: package-distributions
|
|
42
42
|
path: dist/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: UncountablePythonSDK
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.159
|
|
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.157 → uncountablepythonsdk-0.0.159}/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.159
|
|
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
|
|
@@ -126,12 +126,14 @@ uncountable/core/query/__init__.py
|
|
|
126
126
|
uncountable/core/query/builder.py
|
|
127
127
|
uncountable/core/query/column.py
|
|
128
128
|
uncountable/core/query/row.py
|
|
129
|
+
uncountable/core/query/types.py
|
|
129
130
|
uncountable/integration/__init__.py
|
|
130
131
|
uncountable/integration/cli.py
|
|
131
132
|
uncountable/integration/construct_client.py
|
|
132
133
|
uncountable/integration/cron.py
|
|
133
134
|
uncountable/integration/entrypoint.py
|
|
134
135
|
uncountable/integration/job.py
|
|
136
|
+
uncountable/integration/request_context.py
|
|
135
137
|
uncountable/integration/scan_profiles.py
|
|
136
138
|
uncountable/integration/scheduler.py
|
|
137
139
|
uncountable/integration/server.py
|
|
@@ -13,8 +13,7 @@ from uncountable.core.file_upload import DataFileUpload, UploadedFile
|
|
|
13
13
|
client: Client = Client(
|
|
14
14
|
base_url="<BASE_URL>",
|
|
15
15
|
auth_details=AuthDetailsApiKey(
|
|
16
|
-
api_id="<API_ID>",
|
|
17
|
-
api_secret_key="<API_SECRET_KEY>"
|
|
16
|
+
api_id="<API_ID>", api_secret_key="<API_SECRET_KEY>"
|
|
18
17
|
),
|
|
19
18
|
config=ClientConfig(allow_insecure_tls=False),
|
|
20
19
|
)
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/async_batch_large_parse.py
RENAMED
|
@@ -2,6 +2,7 @@ import os
|
|
|
2
2
|
from decimal import Decimal
|
|
3
3
|
|
|
4
4
|
from uncountable.core import AsyncBatchProcessor, AuthDetailsApiKey, Client
|
|
5
|
+
from uncountable.core.file_upload import UploaderFileUpload
|
|
5
6
|
from uncountable.types.generic_upload_t import UploadDestinationRecipe
|
|
6
7
|
from uncountable.types.identifier import IdentifierKeyId
|
|
7
8
|
from uncountable.types.uploader_t import (
|
|
@@ -37,8 +38,13 @@ parsed_file_data = [
|
|
|
37
38
|
]
|
|
38
39
|
|
|
39
40
|
batch_loader = AsyncBatchProcessor(client=client)
|
|
41
|
+
|
|
42
|
+
uploaded = client.upload_files(
|
|
43
|
+
file_uploads=[UploaderFileUpload(parsed_file_data=parsed_file_data)]
|
|
44
|
+
)
|
|
45
|
+
|
|
40
46
|
batch_loader.complete_async_parse(
|
|
41
|
-
|
|
47
|
+
file_id=uploaded[0].file_id,
|
|
42
48
|
async_job_key=IdentifierKeyId(id=1),
|
|
43
49
|
upload_destination=UploadDestinationRecipe(
|
|
44
50
|
recipe_key=IdentifierKeyId(id=1),
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_open_api.py
RENAMED
|
@@ -105,7 +105,11 @@ def _open_api_info(
|
|
|
105
105
|
info["version"] = "1.0.0"
|
|
106
106
|
info["title"] = "Uncountable API Documentation"
|
|
107
107
|
info["description"] = full_description
|
|
108
|
-
info["x-logo"] = {
|
|
108
|
+
info["x-logo"] = {
|
|
109
|
+
"url": "../static/images/logo_blue.png",
|
|
110
|
+
"altText": "Logo",
|
|
111
|
+
"href": "#",
|
|
112
|
+
}
|
|
109
113
|
return info
|
|
110
114
|
|
|
111
115
|
|
|
@@ -23,6 +23,7 @@ from uncountable.integration.telemetry import Logger, push_scope_optional
|
|
|
23
23
|
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
|
+
from uncountable.types.client_config_t import RequestContext
|
|
26
27
|
|
|
27
28
|
from .file_upload import FileUpload, FileUploader, UploadedFile
|
|
28
29
|
from .types import AuthDetailsAll, AuthDetailsApiKey, AuthDetailsOAuth
|
|
@@ -65,6 +66,7 @@ class ClientConfig(ClientConfigOptions):
|
|
|
65
66
|
None
|
|
66
67
|
)
|
|
67
68
|
logger: Logger | None = None
|
|
69
|
+
request_context: RequestContext | None = None
|
|
68
70
|
|
|
69
71
|
|
|
70
72
|
OAUTH_REFRESH_WINDOW_SECONDS = 60 * 5
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/file_upload.py
RENAMED
|
@@ -8,8 +8,11 @@ from typing import Generator, Literal, Self, assert_never
|
|
|
8
8
|
|
|
9
9
|
import aiohttp
|
|
10
10
|
import aiotus
|
|
11
|
+
import simplejson as json
|
|
11
12
|
|
|
13
|
+
from pkgs.serialization_util import serialize_for_storage
|
|
12
14
|
from uncountable.integration.telemetry import Logger, push_scope_optional
|
|
15
|
+
from uncountable.types import uploader_t
|
|
13
16
|
|
|
14
17
|
from .types import AuthDetailsAll, AuthDetailsApiKey
|
|
15
18
|
|
|
@@ -19,6 +22,7 @@ _CHUNK_SIZE = 5 * 1024 * 1024 # s3 requires 5MiB minimum
|
|
|
19
22
|
class FileUploadType(StrEnum):
|
|
20
23
|
MEDIA_FILE_UPLOAD = "MEDIA_FILE_UPLOAD"
|
|
21
24
|
DATA_FILE_UPLOAD = "DATA_FILE_UPLOAD"
|
|
25
|
+
UPLOADER_FILE_UPLOAD = "UPLOADER_FILE_UPLOAD"
|
|
22
26
|
|
|
23
27
|
|
|
24
28
|
@dataclass(kw_only=True)
|
|
@@ -36,7 +40,20 @@ class DataFileUpload:
|
|
|
36
40
|
type: Literal[FileUploadType.DATA_FILE_UPLOAD] = FileUploadType.DATA_FILE_UPLOAD
|
|
37
41
|
|
|
38
42
|
|
|
39
|
-
|
|
43
|
+
@dataclass(kw_only=True)
|
|
44
|
+
class UploaderFileUpload:
|
|
45
|
+
parsed_file_data: list[uploader_t.ParsedFileData]
|
|
46
|
+
type: Literal[FileUploadType.UPLOADER_FILE_UPLOAD] = (
|
|
47
|
+
FileUploadType.UPLOADER_FILE_UPLOAD
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
FileUpload = MediaFileUpload | DataFileUpload | UploaderFileUpload
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@dataclass(kw_only=True)
|
|
55
|
+
class _ParsedFileDataWrapper:
|
|
56
|
+
parsed_file_data: list[uploader_t.ParsedFileData]
|
|
40
57
|
|
|
41
58
|
|
|
42
59
|
@dataclass(kw_only=True)
|
|
@@ -55,6 +72,16 @@ def file_upload_data(file_upload: FileUpload) -> Generator[FileBytes, None, None
|
|
|
55
72
|
)
|
|
56
73
|
case DataFileUpload():
|
|
57
74
|
yield FileBytes(name=file_upload.name, bytes_data=file_upload.data)
|
|
75
|
+
case UploaderFileUpload():
|
|
76
|
+
wrapper = _ParsedFileDataWrapper(
|
|
77
|
+
parsed_file_data=file_upload.parsed_file_data
|
|
78
|
+
)
|
|
79
|
+
serialized = serialize_for_storage(wrapper)
|
|
80
|
+
json_bytes = json.dumps(serialized).encode("utf-8")
|
|
81
|
+
yield FileBytes(
|
|
82
|
+
name="parsed_file_data.json",
|
|
83
|
+
bytes_data=BytesIO(json_bytes),
|
|
84
|
+
)
|
|
58
85
|
|
|
59
86
|
|
|
60
87
|
@dataclass(kw_only=True)
|
|
@@ -107,6 +134,8 @@ class FileUploader:
|
|
|
107
134
|
attributes["file_path"] = file_upload.path
|
|
108
135
|
case DataFileUpload():
|
|
109
136
|
attributes["file_name"] = file_upload.name
|
|
137
|
+
case UploaderFileUpload():
|
|
138
|
+
attributes["file_name"] = "parsed_file_data.json"
|
|
110
139
|
case _:
|
|
111
140
|
assert_never(file_upload)
|
|
112
141
|
with push_scope_optional(
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/column.py
RENAMED
|
@@ -8,11 +8,13 @@ from decimal import Decimal
|
|
|
8
8
|
from enum import StrEnum
|
|
9
9
|
from types import UnionType
|
|
10
10
|
from typing import (
|
|
11
|
+
Never,
|
|
11
12
|
Self,
|
|
12
13
|
assert_never,
|
|
13
14
|
overload,
|
|
14
15
|
)
|
|
15
16
|
|
|
17
|
+
from uncountable.core.query.types import TranslatedText
|
|
16
18
|
from uncountable.types import base_t, entity_t, listing_t
|
|
17
19
|
from uncountable.types.listing import ColumnIdentifier
|
|
18
20
|
|
|
@@ -84,6 +86,9 @@ class Column[
|
|
|
84
86
|
assert self.name is not None
|
|
85
87
|
return obj.__dict__[self.name] # type: ignore[no-any-return]
|
|
86
88
|
|
|
89
|
+
def __set__(self, obj: Never, value: Never) -> None:
|
|
90
|
+
raise AttributeError("Columns are read-only")
|
|
91
|
+
|
|
87
92
|
def __init__(
|
|
88
93
|
self,
|
|
89
94
|
*,
|
|
@@ -159,6 +164,55 @@ class TextColumn[
|
|
|
159
164
|
# IMPROVE: Implement "Not Exists" and "Not Equals" filters (when supported in SDK)
|
|
160
165
|
|
|
161
166
|
|
|
167
|
+
class TranslatedTextColumn[
|
|
168
|
+
NullableT: NullableColumn | NonNullableColumn,
|
|
169
|
+
](Column[TranslatedText, NullableT]):
|
|
170
|
+
__hash__ = Column.__hash__
|
|
171
|
+
|
|
172
|
+
def __init__(
|
|
173
|
+
self,
|
|
174
|
+
identifier: listing_t.ColumnIdentifier,
|
|
175
|
+
nullable: type[NullableT],
|
|
176
|
+
) -> None:
|
|
177
|
+
super().__init__(
|
|
178
|
+
identifier=identifier,
|
|
179
|
+
nullable=nullable,
|
|
180
|
+
value_type=TranslatedText,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
def __ne__(self, other: None) -> ColumnFilter: # type: ignore[override]
|
|
184
|
+
return ColumnFilter(
|
|
185
|
+
identifier=self.identifier,
|
|
186
|
+
filter=lambda identifier: listing_t.FilterSpecExists(column=identifier),
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
def __eq__(self, other: str) -> ColumnFilter: # type: ignore[override]
|
|
190
|
+
return ColumnFilter(
|
|
191
|
+
identifier=self.identifier,
|
|
192
|
+
filter=lambda x: listing_t.FilterSpecEquals(column=x, value=other),
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
def contains(self, other: str) -> ColumnFilter:
|
|
196
|
+
return ColumnFilter(
|
|
197
|
+
identifier=self.identifier,
|
|
198
|
+
filter=lambda x: listing_t.FilterSpecIStrContains(column=x, value=other),
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
def startswith(self, other: str) -> ColumnFilter:
|
|
202
|
+
return ColumnFilter(
|
|
203
|
+
identifier=self.identifier,
|
|
204
|
+
filter=lambda x: listing_t.FilterSpecIStrStartsWith(column=x, value=other),
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
def includes(self, other: str | tuple[str, ...]) -> ColumnFilter:
|
|
208
|
+
return ColumnFilter(
|
|
209
|
+
identifier=self.identifier,
|
|
210
|
+
filter=lambda x: listing_t.FilterSpecInclude(column=x, value=other),
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# IMPROVE: Implement "Not Exists" and "Not Equals" filters (when supported in SDK)
|
|
214
|
+
|
|
215
|
+
|
|
162
216
|
class EnumColumn[
|
|
163
217
|
EnumT: StrEnum,
|
|
164
218
|
NullableT: NullableColumn | NonNullableColumn,
|
|
@@ -513,6 +567,19 @@ class IdColumn[
|
|
|
513
567
|
column: TextColumn[BaseNullableT],
|
|
514
568
|
) -> TextColumn[BaseNullableT]: ...
|
|
515
569
|
|
|
570
|
+
# Translated Text
|
|
571
|
+
@overload
|
|
572
|
+
def __rshift__[BaseNullableT: NullableColumn | NonNullableColumn](
|
|
573
|
+
self: IdColumn[NullableColumn],
|
|
574
|
+
column: TranslatedTextColumn[BaseNullableT],
|
|
575
|
+
) -> TranslatedTextColumn[NullableColumn]: ...
|
|
576
|
+
|
|
577
|
+
@overload
|
|
578
|
+
def __rshift__[BaseNullableT: NullableColumn | NonNullableColumn](
|
|
579
|
+
self: IdColumn[NonNullableColumn],
|
|
580
|
+
column: TranslatedTextColumn[BaseNullableT],
|
|
581
|
+
) -> TranslatedTextColumn[BaseNullableT]: ...
|
|
582
|
+
|
|
516
583
|
# Enum
|
|
517
584
|
@overload
|
|
518
585
|
def __rshift__[EnumT: StrEnum, BaseNullableT: NullableColumn | NonNullableColumn](
|
|
@@ -658,6 +725,7 @@ class IdColumn[
|
|
|
658
725
|
self,
|
|
659
726
|
column: ColumnFilter
|
|
660
727
|
| TextColumn[BaseNullableT]
|
|
728
|
+
| TranslatedTextColumn[BaseNullableT]
|
|
661
729
|
| EnumColumn[EnumT, BaseNullableT]
|
|
662
730
|
| EnumsColumn[EnumT, BaseNullableT]
|
|
663
731
|
| BooleanColumn[BaseNullableT]
|
|
@@ -673,6 +741,9 @@ class IdColumn[
|
|
|
673
741
|
| TextColumn[BaseNullableT]
|
|
674
742
|
| TextColumn[NonNullableColumn | NullableColumn]
|
|
675
743
|
| TextColumn[NullableColumn]
|
|
744
|
+
| TranslatedTextColumn[BaseNullableT]
|
|
745
|
+
| TranslatedTextColumn[NonNullableColumn | NullableColumn]
|
|
746
|
+
| TranslatedTextColumn[NullableColumn]
|
|
676
747
|
| EnumColumn[EnumT, BaseNullableT]
|
|
677
748
|
| EnumColumn[EnumT, NonNullableColumn | NullableColumn]
|
|
678
749
|
| EnumColumn[EnumT, NullableColumn]
|
|
@@ -731,6 +802,13 @@ class IdColumn[
|
|
|
731
802
|
if self.nullable is NonNullableColumn
|
|
732
803
|
else NullableColumn,
|
|
733
804
|
)
|
|
805
|
+
case TranslatedTextColumn():
|
|
806
|
+
return TranslatedTextColumn(
|
|
807
|
+
identifier=transitive_identifier,
|
|
808
|
+
nullable=column.nullable
|
|
809
|
+
if self.nullable is NonNullableColumn
|
|
810
|
+
else NullableColumn,
|
|
811
|
+
)
|
|
734
812
|
case EnumColumn():
|
|
735
813
|
return EnumColumn(
|
|
736
814
|
identifier=transitive_identifier,
|
|
@@ -896,6 +974,19 @@ class IdsColumn[
|
|
|
896
974
|
column: TextColumn[BaseNullableT],
|
|
897
975
|
) -> AggregatedColumn[tuple[str, ...], BaseNullableT]: ...
|
|
898
976
|
|
|
977
|
+
# Translated Text
|
|
978
|
+
@overload
|
|
979
|
+
def __rshift__[BaseNullableT: NullableColumn | NonNullableColumn](
|
|
980
|
+
self: IdsColumn[NullableColumn],
|
|
981
|
+
column: TranslatedTextColumn[BaseNullableT],
|
|
982
|
+
) -> AggregatedColumn[tuple[TranslatedText, ...], NullableColumn]: ...
|
|
983
|
+
|
|
984
|
+
@overload
|
|
985
|
+
def __rshift__[BaseNullableT: NullableColumn | NonNullableColumn](
|
|
986
|
+
self: IdsColumn[NonNullableColumn],
|
|
987
|
+
column: TranslatedTextColumn[BaseNullableT],
|
|
988
|
+
) -> AggregatedColumn[tuple[TranslatedText, ...], BaseNullableT]: ...
|
|
989
|
+
|
|
899
990
|
# Enum
|
|
900
991
|
@overload
|
|
901
992
|
def __rshift__[EnumT: StrEnum, BaseNullableT: NullableColumn | NonNullableColumn](
|
|
@@ -1030,6 +1121,7 @@ class IdsColumn[
|
|
|
1030
1121
|
](
|
|
1031
1122
|
self,
|
|
1032
1123
|
column: TextColumn[BaseNullableT]
|
|
1124
|
+
| TranslatedTextColumn[BaseNullableT]
|
|
1033
1125
|
| EnumColumn[EnumT, BaseNullableT]
|
|
1034
1126
|
| BooleanColumn[BaseNullableT]
|
|
1035
1127
|
| DatetimeColumn[BaseNullableT]
|
|
@@ -1043,6 +1135,12 @@ class IdsColumn[
|
|
|
1043
1135
|
AggregatedColumn[tuple[str, ...], BaseNullableT]
|
|
1044
1136
|
| AggregatedColumn[tuple[str, ...], NonNullableColumn | NullableColumn]
|
|
1045
1137
|
| AggregatedColumn[tuple[str, ...], NullableColumn]
|
|
1138
|
+
| AggregatedColumn[tuple[TranslatedText, ...], BaseNullableT]
|
|
1139
|
+
| AggregatedColumn[
|
|
1140
|
+
tuple[TranslatedText, ...],
|
|
1141
|
+
NonNullableColumn | NullableColumn,
|
|
1142
|
+
]
|
|
1143
|
+
| AggregatedColumn[tuple[TranslatedText, ...], NullableColumn]
|
|
1046
1144
|
| AggregatedColumn[tuple[str | None, ...], BaseNullableT]
|
|
1047
1145
|
| AggregatedColumn[
|
|
1048
1146
|
tuple[str | None, ...],
|
|
@@ -1090,6 +1188,14 @@ class IdsColumn[
|
|
|
1090
1188
|
else NullableColumn,
|
|
1091
1189
|
tuple_value_type=tuple[str, ...],
|
|
1092
1190
|
)
|
|
1191
|
+
case TranslatedTextColumn():
|
|
1192
|
+
return AggregatedColumn(
|
|
1193
|
+
identifier=transitive_aggregate_identifier,
|
|
1194
|
+
nullable=column.nullable
|
|
1195
|
+
if self.nullable is NonNullableColumn
|
|
1196
|
+
else NullableColumn,
|
|
1197
|
+
tuple_value_type=tuple[TranslatedText, ...],
|
|
1198
|
+
)
|
|
1093
1199
|
case EnumColumn():
|
|
1094
1200
|
return AggregatedColumn(
|
|
1095
1201
|
identifier=transitive_aggregate_identifier,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
# This file contains types exclusively used to parse column values.
|
|
4
|
+
# Column types must be more permissive than generated SDK types to allow for disparity between the installed client and the platform.
|
|
5
|
+
# Eg. types containing an Enum must be typed as EnumType | str to handle future expansion of the Enum by the platform.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(kw_only=True, frozen=True)
|
|
9
|
+
class TranslatedText:
|
|
10
|
+
value: str
|
|
11
|
+
display_value: str
|
|
12
|
+
inferred_locale: str
|
|
@@ -4,6 +4,7 @@ from uncountable.core.types import AuthDetailsAll, AuthDetailsOAuth
|
|
|
4
4
|
from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
|
|
5
5
|
from uncountable.integration.telemetry import JobLogger
|
|
6
6
|
from uncountable.types import auth_retrieval_t
|
|
7
|
+
from uncountable.types.client_config_t import RequestContext
|
|
7
8
|
from uncountable.types.job_definition_t import (
|
|
8
9
|
ProfileMetadata,
|
|
9
10
|
)
|
|
@@ -30,23 +31,34 @@ def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
|
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
def _construct_client_config(
|
|
33
|
-
*,
|
|
34
|
+
*,
|
|
35
|
+
profile_meta: ProfileMetadata,
|
|
36
|
+
job_logger: JobLogger,
|
|
37
|
+
request_context: RequestContext | None = None,
|
|
34
38
|
) -> ClientConfig:
|
|
35
39
|
if profile_meta.client_options is None:
|
|
36
|
-
return ClientConfig(logger=job_logger)
|
|
40
|
+
return ClientConfig(logger=job_logger, request_context=request_context)
|
|
37
41
|
return ClientConfig(
|
|
38
42
|
allow_insecure_tls=profile_meta.client_options.allow_insecure_tls,
|
|
39
43
|
extra_headers=profile_meta.client_options.extra_headers,
|
|
40
44
|
logger=job_logger,
|
|
45
|
+
request_context=request_context,
|
|
41
46
|
)
|
|
42
47
|
|
|
43
48
|
|
|
44
49
|
def construct_uncountable_client(
|
|
45
|
-
profile_meta: ProfileMetadata,
|
|
50
|
+
profile_meta: ProfileMetadata,
|
|
51
|
+
logger: JobLogger,
|
|
52
|
+
*,
|
|
53
|
+
request_context: RequestContext | None = None,
|
|
46
54
|
) -> Client:
|
|
47
55
|
return Client(
|
|
48
56
|
base_url=profile_meta.base_url,
|
|
49
57
|
auth_details=_construct_auth_details(profile_meta),
|
|
50
|
-
config=_construct_client_config(
|
|
58
|
+
config=_construct_client_config(
|
|
59
|
+
profile_meta=profile_meta,
|
|
60
|
+
job_logger=logger,
|
|
61
|
+
request_context=request_context,
|
|
62
|
+
),
|
|
51
63
|
app_base_url=profile_meta.app_base_url,
|
|
52
64
|
)
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/job.py
RENAMED
|
@@ -24,6 +24,7 @@ from uncountable.integration.queue_runner.command_server.command_client import (
|
|
|
24
24
|
from uncountable.integration.queue_runner.command_server.types import (
|
|
25
25
|
CommandServerException,
|
|
26
26
|
)
|
|
27
|
+
from uncountable.integration.request_context import extract_request_context
|
|
27
28
|
from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
|
|
28
29
|
from uncountable.integration.telemetry import JobLogger
|
|
29
30
|
from uncountable.types import (
|
|
@@ -210,12 +211,15 @@ class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
|
|
|
210
211
|
except (simplejson.JSONDecodeError, ValueError) as e:
|
|
211
212
|
raise HttpException.body_parse_error() from e
|
|
212
213
|
|
|
214
|
+
request_context = extract_request_context(headers=request.headers)
|
|
215
|
+
|
|
213
216
|
try:
|
|
214
217
|
send_job_queue_message(
|
|
215
218
|
job_ref_name=job_definition.id,
|
|
216
219
|
payload=queued_job_t.QueuedJobPayload(
|
|
217
220
|
invocation_context=queued_job_t.InvocationContextWebhook(
|
|
218
|
-
webhook_payload=webhook_payload
|
|
221
|
+
webhook_payload=webhook_payload,
|
|
222
|
+
request_context=request_context,
|
|
219
223
|
)
|
|
220
224
|
),
|
|
221
225
|
port=get_local_admin_server_port(),
|
|
@@ -41,8 +41,7 @@ def command_server_connection(
|
|
|
41
41
|
) -> Generator[CommandServerStub, None, None]:
|
|
42
42
|
try:
|
|
43
43
|
with grpc.insecure_channel(f"{host}:{port}") as channel:
|
|
44
|
-
|
|
45
|
-
yield stub
|
|
44
|
+
yield CommandServerStub(channel)
|
|
46
45
|
except grpc._channel._InactiveRpcError as e:
|
|
47
46
|
raise CommandServerTimeout() from e
|
|
48
47
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from uncountable.types import client_config_t
|
|
2
|
+
|
|
3
|
+
MAX_HEADER_LENGTH = 100
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def validated_header(*, headers: dict[str, str], key: str) -> str | None:
|
|
7
|
+
value = headers.get(key)
|
|
8
|
+
if value is not None and len(value) > MAX_HEADER_LENGTH:
|
|
9
|
+
return None
|
|
10
|
+
return value
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _parse_locale(*, raw_locale: str | None) -> client_config_t.SdkLocale | None:
|
|
14
|
+
if raw_locale is None:
|
|
15
|
+
return None
|
|
16
|
+
try:
|
|
17
|
+
return client_config_t.SdkLocale(raw_locale)
|
|
18
|
+
except ValueError:
|
|
19
|
+
return None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def extract_request_context(
|
|
23
|
+
*, headers: dict[str, str]
|
|
24
|
+
) -> client_config_t.RequestContext | None:
|
|
25
|
+
user_timezone = validated_header(headers=headers, key="X-User-Timezone")
|
|
26
|
+
user_locale = _parse_locale(
|
|
27
|
+
raw_locale=validated_header(headers=headers, key="X-User-Locale")
|
|
28
|
+
)
|
|
29
|
+
if user_timezone is None and user_locale is None:
|
|
30
|
+
return None
|
|
31
|
+
return client_config_t.RequestContext(
|
|
32
|
+
user_timezone=user_timezone,
|
|
33
|
+
user_locale=user_locale,
|
|
34
|
+
)
|
|
@@ -31,9 +31,10 @@ ENDPOINT_PATH = "api/external/uploader/complete_async_parse"
|
|
|
31
31
|
)
|
|
32
32
|
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
33
33
|
class Arguments:
|
|
34
|
-
parsed_file_data: list[uploader_t.ParsedFileData]
|
|
35
34
|
async_job_key: identifier_t.IdentifierKey
|
|
36
35
|
upload_destination: generic_upload_t.UploadDestinationRecipe
|
|
36
|
+
parsed_file_data: list[uploader_t.ParsedFileData] | None = None
|
|
37
|
+
file_id: base_t.ObjectId | None = None
|
|
37
38
|
|
|
38
39
|
|
|
39
40
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -205,18 +205,22 @@ class AsyncBatchProcessorBase(ABC):
|
|
|
205
205
|
def complete_async_parse(
|
|
206
206
|
self,
|
|
207
207
|
*,
|
|
208
|
-
parsed_file_data: list[uploader_t.ParsedFileData],
|
|
209
208
|
async_job_key: identifier_t.IdentifierKey,
|
|
210
209
|
upload_destination: generic_upload_t.UploadDestinationRecipe,
|
|
210
|
+
parsed_file_data: list[uploader_t.ParsedFileData] | None = None,
|
|
211
|
+
file_id: base_t.ObjectId | None = None,
|
|
211
212
|
depends_on: list[str] | None = None,
|
|
212
213
|
_request_options: client_config_t.RequestOptions | None = None,
|
|
213
214
|
) -> async_batch_t.QueuedAsyncBatchRequest:
|
|
214
215
|
"""Parses uploaded files asynchronously
|
|
215
216
|
|
|
217
|
+
:param parsed_file_data: Inline parsed data. Provide either parsed_file_data or file_id, not both.
|
|
218
|
+
:param file_id: File ID containing parsed data. Provide either file_id or parsed_file_data, not both.
|
|
216
219
|
:param depends_on: A list of batch reference keys to process before processing this request
|
|
217
220
|
"""
|
|
218
221
|
args = complete_async_parse_t.Arguments(
|
|
219
222
|
parsed_file_data=parsed_file_data,
|
|
223
|
+
file_id=file_id,
|
|
220
224
|
async_job_key=async_job_key,
|
|
221
225
|
upload_destination=upload_destination,
|
|
222
226
|
)
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_base.py
RENAMED
|
@@ -340,16 +340,20 @@ class ClientMethods(ABC):
|
|
|
340
340
|
def complete_async_parse(
|
|
341
341
|
self,
|
|
342
342
|
*,
|
|
343
|
-
parsed_file_data: list[uploader_t.ParsedFileData],
|
|
344
343
|
async_job_key: identifier_t.IdentifierKey,
|
|
345
344
|
upload_destination: generic_upload_t.UploadDestinationRecipe,
|
|
345
|
+
parsed_file_data: list[uploader_t.ParsedFileData] | None = None,
|
|
346
|
+
file_id: base_t.ObjectId | None = None,
|
|
346
347
|
_request_options: client_config_t.RequestOptions | None = None,
|
|
347
348
|
) -> complete_async_parse_t.Data:
|
|
348
349
|
"""Parses uploaded files asynchronously
|
|
349
350
|
|
|
351
|
+
:param parsed_file_data: Inline parsed data. Provide either parsed_file_data or file_id, not both.
|
|
352
|
+
:param file_id: File ID containing parsed data. Provide either file_id or parsed_file_data, not both.
|
|
350
353
|
"""
|
|
351
354
|
args = complete_async_parse_t.Arguments(
|
|
352
355
|
parsed_file_data=parsed_file_data,
|
|
356
|
+
file_id=file_id,
|
|
353
357
|
async_job_key=async_job_key,
|
|
354
358
|
upload_destination=upload_destination,
|
|
355
359
|
)
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_config.py
RENAMED
|
@@ -4,5 +4,7 @@
|
|
|
4
4
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
5
5
|
# Kept only for SDK backwards compatibility
|
|
6
6
|
from .client_config_t import ClientConfigOptions as ClientConfigOptions
|
|
7
|
+
from .client_config_t import SdkLocale as SdkLocale
|
|
8
|
+
from .client_config_t import RequestContext as RequestContext
|
|
7
9
|
from .client_config_t import RequestOptions as RequestOptions
|
|
8
10
|
# DO NOT MODIFY -- This file is generated by type_spec
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_config_t.py
RENAMED
|
@@ -6,13 +6,16 @@ from __future__ import annotations
|
|
|
6
6
|
import typing # noqa: F401
|
|
7
7
|
import datetime # noqa: F401
|
|
8
8
|
from decimal import Decimal # noqa: F401
|
|
9
|
+
from enum import StrEnum
|
|
9
10
|
import dataclasses
|
|
10
11
|
from pkgs.serialization import serial_class
|
|
11
12
|
from . import base_t
|
|
12
13
|
|
|
13
14
|
__all__: list[str] = [
|
|
14
15
|
"ClientConfigOptions",
|
|
16
|
+
"RequestContext",
|
|
15
17
|
"RequestOptions",
|
|
18
|
+
"SdkLocale",
|
|
16
19
|
]
|
|
17
20
|
|
|
18
21
|
|
|
@@ -26,6 +29,39 @@ class ClientConfigOptions:
|
|
|
26
29
|
extra_headers: dict[str, str] | None = None
|
|
27
30
|
|
|
28
31
|
|
|
32
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
33
|
+
class SdkLocale(StrEnum):
|
|
34
|
+
EN_US = "en-US"
|
|
35
|
+
DE_DE = "de-DE"
|
|
36
|
+
JA_JP = "ja-JP"
|
|
37
|
+
ES_ES = "es-ES"
|
|
38
|
+
ES_MX = "es-MX"
|
|
39
|
+
PT_BR = "pt-BR"
|
|
40
|
+
FR_FR = "fr-FR"
|
|
41
|
+
KO_KO = "ko-KR"
|
|
42
|
+
TH_TH = "th-TH"
|
|
43
|
+
ZH_CN = "zh-CN"
|
|
44
|
+
IT_IT = "it-IT"
|
|
45
|
+
AR_SA = "ar-SA"
|
|
46
|
+
TR_TR = "tr-TR"
|
|
47
|
+
PL_PL = "pl-PL"
|
|
48
|
+
RU_RU = "ru-RU"
|
|
49
|
+
ID_ID = "id-ID"
|
|
50
|
+
NO_NO = "no-NO"
|
|
51
|
+
MR_MR = "mr-MR"
|
|
52
|
+
ZH_TW = "zh-TW"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
56
|
+
@serial_class(
|
|
57
|
+
named_type_path="sdk.client_config.RequestContext",
|
|
58
|
+
)
|
|
59
|
+
@dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
|
|
60
|
+
class RequestContext:
|
|
61
|
+
user_timezone: str | None = None
|
|
62
|
+
user_locale: SdkLocale | None = None
|
|
63
|
+
|
|
64
|
+
|
|
29
65
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
30
66
|
@serial_class(
|
|
31
67
|
named_type_path="sdk.client_config.RequestOptions",
|
{uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/queued_job_t.py
RENAMED
|
@@ -11,6 +11,7 @@ import dataclasses
|
|
|
11
11
|
from pkgs.serialization import serial_class
|
|
12
12
|
from pkgs.serialization import serial_union_annotation
|
|
13
13
|
from . import base_t
|
|
14
|
+
from . import client_config_t
|
|
14
15
|
from . import job_definition_t
|
|
15
16
|
|
|
16
17
|
__all__: list[str] = [
|
|
@@ -74,6 +75,7 @@ class InvocationContextManual(InvocationContextBase):
|
|
|
74
75
|
class InvocationContextWebhook(InvocationContextBase):
|
|
75
76
|
type: typing.Literal[InvocationContextType.WEBHOOK] = InvocationContextType.WEBHOOK
|
|
76
77
|
webhook_payload: base_t.JsonValue
|
|
78
|
+
request_context: client_config_t.RequestContext | None = None
|
|
77
79
|
|
|
78
80
|
|
|
79
81
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
File without changes
|
|
File without changes
|