UncountablePythonSDK 0.0.181__tar.gz → 0.0.183__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.181/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.183}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/UncountablePythonSDK.egg-info/SOURCES.txt +2 -3
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/profile.yaml +8 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_blob_session.py +52 -12
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_file_share_session.py +43 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_s3_session.py +53 -7
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/filesystem_session.py +11 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/environment.py +0 -4
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/entrypoint.py +4 -1
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/http_server/types.py +4 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/job.py +1 -1
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/provision_webhook.py +4 -8
- uncountablepythonsdk-0.0.183/uncountable/integration/webhook_bootstrap.py +67 -0
- uncountablepythonsdk-0.0.183/uncountable/integration/webhook_entity.py +147 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/webhook_server/entrypoint.py +0 -2
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_inputs.py +1 -1
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/client_base.py +1 -1
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/generic_upload.py +1 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/generic_upload_t.py +14 -1
- uncountablepythonsdk-0.0.181/uncountable/integration/webhook_server/admin_auth.py +0 -38
- uncountablepythonsdk-0.0.181/uncountable/integration/webhook_server/admin_routes.py +0 -49
- uncountablepythonsdk-0.0.181/uncountable/integration/webhook_signature_key.py +0 -110
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/.github/workflows/documentation.yml +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/.github/workflows/publish.yml +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/.gitignore +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/README.md +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/UncountablePythonSDK.egg-info/requires.txt +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/.flowmarkignore +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/.gitignore +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/conf.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/index.md +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/integration_examples/add_file_to_folder.md +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/integration_examples/create_ingredient.md +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/integration_examples/create_output.md +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/integration_examples/index.md +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/integration_examples/upload_file.md +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/justfile +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/requirements.txt +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/android-chrome-192x192.png +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/android-chrome-512x512.png +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/apple-touch-icon.png +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/browserconfig.xml +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/favicon-16x16.png +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/favicon-32x32.png +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/manifest.json +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/mstile-150x150.png +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/favicons/safari-pinned-tab.svg +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/docs/static/logo_blue.png +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/async_batch_large_parse.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/basic_auth.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/create_ingredient_sdk.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/download_files.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/integration-server/pyproject.toml +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/oauth.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/set_input_pdf_attribute.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/set_recipe_metadata_file.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/set_recipe_output_file_sdk.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/stream_dataset_measurements.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/examples/upload_files.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/cached_parser.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/case_convert.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_base.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_builder.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_cache.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_error.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_function_type.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_inner.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_options.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/type_predicates.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_local_session.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_sftp_connection.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_sftp_session.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/file_type_utils.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/py.typed +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/annotation.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/missing_sentry.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/opaque_key.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/serial_alias.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/serial_class.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/serial_generic.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/serial_union.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/unknown.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/usage.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization/yaml.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/dataclasses.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/serialization_helpers.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/strenum_compat/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/strenum_compat/strenum_compat.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/actions_registry/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/actions_registry/__main__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/actions_registry/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/builder.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/builder_types.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/config.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/cross_output_links.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_io_ts.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_open_api.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_scss.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_typescript_util.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/load_types.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/parts/base.py.prepart +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/parts/base.ts.prepart +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/test.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/type_info/__main__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/util.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/convert_type.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/types.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pyproject.toml +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/setup.cfg +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/client.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/file_upload.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/query/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/query/builder.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/query/column.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/query/row.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/query/types.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/types.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/cli.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/construct_client.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/cron.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/db/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/db/connect.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/db/session.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/executors/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/executors/executors.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/executors/generic_upload_executor.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/executors/script_executor.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/http_server/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/types.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/datastore_postgres.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/datastore_sql_base.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/factory.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/model.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/job_process.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/job_runner.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/queue_runner.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/types.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/worker.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/request_context.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/scan_profiles.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/scheduler.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/secret_retrieval/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/secret_retrieval/basic_secret.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/server.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/telemetry.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/py.typed +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/batch/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/batch/execute_batch.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/chemical/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/condition_parameters/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/condition_parameters/upsert_condition_matches.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/create_entities.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/create_or_update_entities.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/export_entities.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/get_entities_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/list_aggregate.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/list_entities.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/lock_entity.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/lookup_entity.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/set_barcode.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/set_entities_field_values.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/set_values.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/unlock_entity.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/equipment/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/field_options/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/file_folders/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/file_folders/add_file_to_folder.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/files/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/files/download_file.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/id_source/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/id_source/list_id_source.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/id_source/match_id_source.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/input_groups/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/create_inputs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/get_input_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/get_input_names.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/set_input_category.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/integrations/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/integrations/push_notification.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/listing/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/listing/export_listing.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/listing/fetch_listing.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/material_families/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/ml/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/ml/get_analyze_results.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/ml/get_suggest_results.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/ml/submit_async_job.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/notebooks/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/output_parameters/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/output_parameters/swap_output_condition_parameters.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/get_output_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/get_output_names.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/get_output_organization.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/permissions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/project/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/project/get_projects.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/project/get_projects_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_links/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_links/create_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/archive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/create_mix_order.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/create_recipe.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/create_recipes.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_curve.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/lock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/upsert_step_relationships.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/runsheet/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/time_series/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/time_series/ingest_dataset_measurements.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/triggers/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/triggers/run_trigger.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/uploader/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/user/__init__.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/api/user/get_current_user_info.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/async_batch_processor.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/async_batch_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/async_jobs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/async_jobs_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/auth_retrieval.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/auth_retrieval_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/base.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/base_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/calculations.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/calculations_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/chemical_structure.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/chemical_structure_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/client_config.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/client_config_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/condition_match.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/condition_match_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/curves.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/curves_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/data.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/data_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/dataset_measurements.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/dataset_measurements_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/entity.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/entity_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/experiment_groups.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/experiment_groups_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/exports.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/exports_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/field_values.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/field_values_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/fields.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/fields_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/id_source.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/id_source_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/identifier.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/identifier_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/input_attributes.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/input_attributes_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/inputs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/integration_server.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/integration_server_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/integration_session.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/integration_session_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/integrations.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/integrations_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/job_definition.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/job_definition_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/listing.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/listing_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/ml_reports.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/ml_reports_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/notices.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/notices_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/notifications.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/notifications_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/outputs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/outputs_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/overrides.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/overrides_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/permissions.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/permissions_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/phases.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/phases_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/post_base.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/post_base_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/queued_job.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/queued_job_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_identifiers.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_identifiers_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_links_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_output_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_step_relationships.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_step_relationships_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_tags_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_workflow_step_types.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_workflow_step_types_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_workflow_steps.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_workflow_steps_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipes.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/recipes_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/request_headers.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/request_headers_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/response.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/response_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/runsheet.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/runsheet_format.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/runsheet_format_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/runsheet_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/secret_retrieval.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/secret_retrieval_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/sockets.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/sockets_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/specs.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/specs_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/step_relationships.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/step_relationships_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/units.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/units_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/uploader.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/uploader_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/users.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/users_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/webhook.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/webhook_job.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/webhook_job_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/webhook_t.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/workflows.py +0 -0
- {uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/workflows_t.py +0 -0
{uncountablepythonsdk-0.0.181/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.183}/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.183
|
|
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.181 → uncountablepythonsdk-0.0.183/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.183
|
|
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
|
|
@@ -151,7 +151,8 @@ uncountable/integration/scan_profiles.py
|
|
|
151
151
|
uncountable/integration/scheduler.py
|
|
152
152
|
uncountable/integration/server.py
|
|
153
153
|
uncountable/integration/telemetry.py
|
|
154
|
-
uncountable/integration/
|
|
154
|
+
uncountable/integration/webhook_bootstrap.py
|
|
155
|
+
uncountable/integration/webhook_entity.py
|
|
155
156
|
uncountable/integration/db/__init__.py
|
|
156
157
|
uncountable/integration/db/connect.py
|
|
157
158
|
uncountable/integration/db/session.py
|
|
@@ -189,8 +190,6 @@ uncountable/integration/queue_runner/datastore/model.py
|
|
|
189
190
|
uncountable/integration/secret_retrieval/__init__.py
|
|
190
191
|
uncountable/integration/secret_retrieval/basic_secret.py
|
|
191
192
|
uncountable/integration/secret_retrieval/retrieve_secret.py
|
|
192
|
-
uncountable/integration/webhook_server/admin_auth.py
|
|
193
|
-
uncountable/integration/webhook_server/admin_routes.py
|
|
194
193
|
uncountable/integration/webhook_server/entrypoint.py
|
|
195
194
|
uncountable/types/__init__.py
|
|
196
195
|
uncountable/types/async_batch.py
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
base_url: http://host.docker.internal:5000
|
|
2
|
+
integration_server_base_url: http://localhost:5001
|
|
2
3
|
auth_retrieval:
|
|
3
4
|
type: basic
|
|
4
5
|
api_id_secret:
|
|
@@ -60,6 +61,13 @@ jobs:
|
|
|
60
61
|
executor:
|
|
61
62
|
type: script
|
|
62
63
|
import_path: example_wh
|
|
64
|
+
- id: example_unc_wh
|
|
65
|
+
type: uncountable_webhook
|
|
66
|
+
name: Uncountable Webhook
|
|
67
|
+
purpose: trigger
|
|
68
|
+
executor:
|
|
69
|
+
type: script
|
|
70
|
+
import_path: example_wh
|
|
63
71
|
- id: example_http
|
|
64
72
|
type: custom_http
|
|
65
73
|
name: Custom HTTP
|
{uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_blob_session.py
RENAMED
|
@@ -2,7 +2,7 @@ from io import BytesIO
|
|
|
2
2
|
from typing import Self
|
|
3
3
|
|
|
4
4
|
from azure.core.credentials import AzureSasCredential
|
|
5
|
-
from azure.storage.blob import BlobServiceClient, ContainerClient
|
|
5
|
+
from azure.storage.blob import BlobPrefix, BlobServiceClient, ContainerClient
|
|
6
6
|
|
|
7
7
|
from pkgs.filesystem_utils.file_type_utils import (
|
|
8
8
|
FileObjectData,
|
|
@@ -78,6 +78,24 @@ class BlobSession(FileSystemSession):
|
|
|
78
78
|
|
|
79
79
|
return filesystem_file_references
|
|
80
80
|
|
|
81
|
+
def list_directories(self, dir_path: FileSystemObject) -> list[FileSystemObject]:
|
|
82
|
+
if not isinstance(dir_path, FileSystemFileReference):
|
|
83
|
+
raise IncompatibleFileReferenceError()
|
|
84
|
+
|
|
85
|
+
assert self.service_client is not None and self.container_client is not None, (
|
|
86
|
+
"call to list_directories on uninitialized blob session"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
prefix = _add_slash(dir_path.filepath)
|
|
90
|
+
directories: list[FileSystemObject] = []
|
|
91
|
+
for item in self.container_client.walk_blobs(
|
|
92
|
+
name_starts_with=prefix, delimiter="/"
|
|
93
|
+
):
|
|
94
|
+
if isinstance(item, BlobPrefix):
|
|
95
|
+
directories.append(FileSystemFileReference(item.name.rstrip("/")))
|
|
96
|
+
|
|
97
|
+
return directories
|
|
98
|
+
|
|
81
99
|
def download_files(
|
|
82
100
|
self,
|
|
83
101
|
filepaths: list[FileSystemObject],
|
|
@@ -108,6 +126,22 @@ class BlobSession(FileSystemSession):
|
|
|
108
126
|
|
|
109
127
|
return downloaded_files
|
|
110
128
|
|
|
129
|
+
def _move_blob(self, src_name: str, dest_name: str) -> None:
|
|
130
|
+
assert self.container_client is not None, (
|
|
131
|
+
"call to _move_blob on uninitialized blob session"
|
|
132
|
+
)
|
|
133
|
+
source_blob_client = self.container_client.get_blob_client(src_name)
|
|
134
|
+
dest_blob_client = self.container_client.get_blob_client(dest_name)
|
|
135
|
+
|
|
136
|
+
source_url = (
|
|
137
|
+
f"{source_blob_client.url}?{self.config.credential.signature}"
|
|
138
|
+
if isinstance(self.config.credential, AzureSasCredential)
|
|
139
|
+
else source_blob_client.url
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
dest_blob_client.start_copy_from_url(source_url)
|
|
143
|
+
source_blob_client.delete_blob()
|
|
144
|
+
|
|
111
145
|
def move_files(self, file_mappings: list[FileTransfer]) -> None:
|
|
112
146
|
assert self.service_client is not None and self.container_client is not None, (
|
|
113
147
|
"call to move_files on uninitialized blob session"
|
|
@@ -119,19 +153,25 @@ class BlobSession(FileSystemSession):
|
|
|
119
153
|
):
|
|
120
154
|
raise IncompatibleFileReferenceError()
|
|
121
155
|
|
|
122
|
-
|
|
123
|
-
src_file.filepath
|
|
124
|
-
)
|
|
125
|
-
dest_blob_client = self.container_client.get_blob_client(dest_file.filepath)
|
|
156
|
+
self._move_blob(src_file.filepath, dest_file.filepath)
|
|
126
157
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
158
|
+
def move_directory(
|
|
159
|
+
self, src_dir: FileSystemObject, dest_dir: FileSystemObject
|
|
160
|
+
) -> None:
|
|
161
|
+
if not isinstance(src_dir, FileSystemFileReference) or not isinstance(
|
|
162
|
+
dest_dir, FileSystemFileReference
|
|
163
|
+
):
|
|
164
|
+
raise IncompatibleFileReferenceError()
|
|
165
|
+
|
|
166
|
+
assert self.service_client is not None and self.container_client is not None, (
|
|
167
|
+
"call to move_directory on uninitialized blob session"
|
|
168
|
+
)
|
|
132
169
|
|
|
133
|
-
|
|
134
|
-
|
|
170
|
+
src_prefix = _add_slash(src_dir.filepath)
|
|
171
|
+
dest_prefix = _add_slash(dest_dir.filepath)
|
|
172
|
+
for blob in self.container_client.list_blobs(name_starts_with=src_prefix):
|
|
173
|
+
dest_name = dest_prefix + blob.name[len(src_prefix) :]
|
|
174
|
+
self._move_blob(blob.name, dest_name)
|
|
135
175
|
|
|
136
176
|
def delete_files(self, filepaths: list[FileSystemObject]) -> None:
|
|
137
177
|
assert self.service_client is not None and self.container_client is not None, (
|
|
@@ -79,6 +79,49 @@ class FileShareSession(FileSystemSession):
|
|
|
79
79
|
dir_client, recursive=recursive, valid_extensions=valid_extensions
|
|
80
80
|
)
|
|
81
81
|
|
|
82
|
+
def list_directories(self, dir_path: FileSystemObject) -> list[FileSystemObject]:
|
|
83
|
+
if not isinstance(dir_path, FileSystemFileReference):
|
|
84
|
+
raise IncompatibleFileReferenceError()
|
|
85
|
+
assert self._share_client is not None, (
|
|
86
|
+
"call to list_directories on uninitialized file share session"
|
|
87
|
+
)
|
|
88
|
+
dir_client = self._share_client.get_directory_client(dir_path.filepath)
|
|
89
|
+
directories: list[FileSystemObject] = []
|
|
90
|
+
for item in dir_client.list_directories_and_files():
|
|
91
|
+
if item["is_directory"]:
|
|
92
|
+
item_path = f"{dir_client.directory_path}/{item['name']}".lstrip("/")
|
|
93
|
+
directories.append(FileSystemFileReference(filepath=item_path))
|
|
94
|
+
return directories
|
|
95
|
+
|
|
96
|
+
def create_directory(self, dir_path: FileSystemObject) -> None:
|
|
97
|
+
if not isinstance(dir_path, FileSystemFileReference):
|
|
98
|
+
raise IncompatibleFileReferenceError()
|
|
99
|
+
assert self._share_client is not None, (
|
|
100
|
+
"call to create_directory on uninitialized file share session"
|
|
101
|
+
)
|
|
102
|
+
current = ""
|
|
103
|
+
for segment in dir_path.filepath.strip("/").split("/"):
|
|
104
|
+
if not segment:
|
|
105
|
+
continue
|
|
106
|
+
current = f"{current}/{segment}".lstrip("/")
|
|
107
|
+
dir_client = self._share_client.get_directory_client(current)
|
|
108
|
+
if not dir_client.exists():
|
|
109
|
+
dir_client.create_directory()
|
|
110
|
+
|
|
111
|
+
def move_directory(
|
|
112
|
+
self, src_dir: FileSystemObject, dest_dir: FileSystemObject
|
|
113
|
+
) -> None:
|
|
114
|
+
if not isinstance(src_dir, FileSystemFileReference) or not isinstance(
|
|
115
|
+
dest_dir, FileSystemFileReference
|
|
116
|
+
):
|
|
117
|
+
raise IncompatibleFileReferenceError()
|
|
118
|
+
assert self._share_client is not None, (
|
|
119
|
+
"call to move_directory on uninitialized file share session"
|
|
120
|
+
)
|
|
121
|
+
self._share_client.get_directory_client(src_dir.filepath).rename_directory(
|
|
122
|
+
dest_dir.filepath
|
|
123
|
+
)
|
|
124
|
+
|
|
82
125
|
def download_files(self, filepaths: list[FileSystemObject]) -> list[FileObjectData]:
|
|
83
126
|
assert self._share_client is not None, (
|
|
84
127
|
"call to download_files on uninitialized file share session"
|
{uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_s3_session.py
RENAMED
|
@@ -86,6 +86,28 @@ class S3Session(FileSystemSession):
|
|
|
86
86
|
|
|
87
87
|
return filesystem_references
|
|
88
88
|
|
|
89
|
+
def list_directories(self, dir_path: FileSystemObject) -> list[FileSystemObject]:
|
|
90
|
+
if not isinstance(dir_path, FileSystemFileReference):
|
|
91
|
+
raise IncompatibleFileReferenceError()
|
|
92
|
+
|
|
93
|
+
assert self.bucket is not None, (
|
|
94
|
+
"call to list_directories on uninitialized s3 session"
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
prefix = _add_slash(dir_path.filepath)
|
|
98
|
+
paginator = self.bucket.meta.client.get_paginator("list_objects_v2")
|
|
99
|
+
|
|
100
|
+
directories: list[FileSystemObject] = []
|
|
101
|
+
for page in paginator.paginate(
|
|
102
|
+
Bucket=self.bucket.name, Prefix=prefix, Delimiter="/"
|
|
103
|
+
):
|
|
104
|
+
for common_prefix in page.get("CommonPrefixes", []):
|
|
105
|
+
directories.append(
|
|
106
|
+
FileSystemFileReference(common_prefix["Prefix"].rstrip("/"))
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
return directories
|
|
110
|
+
|
|
89
111
|
def download_files(
|
|
90
112
|
self,
|
|
91
113
|
filepaths: list[FileSystemObject],
|
|
@@ -115,6 +137,18 @@ class S3Session(FileSystemSession):
|
|
|
115
137
|
|
|
116
138
|
return downloaded_files
|
|
117
139
|
|
|
140
|
+
def _move_object(self, src_key: str, dest_key: str) -> None:
|
|
141
|
+
assert self.bucket is not None, (
|
|
142
|
+
"call to _move_object on uninitialized s3 session"
|
|
143
|
+
)
|
|
144
|
+
self.bucket.Object(dest_key).copy_from(
|
|
145
|
+
CopySource={
|
|
146
|
+
"Bucket": self.bucket.name,
|
|
147
|
+
"Key": src_key,
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
self.bucket.Object(src_key).delete()
|
|
151
|
+
|
|
118
152
|
def move_files(self, file_mappings: list[FileTransfer]) -> None:
|
|
119
153
|
assert self.bucket is not None, "call to move_files on uninitialized s3 session"
|
|
120
154
|
|
|
@@ -123,10 +157,22 @@ class S3Session(FileSystemSession):
|
|
|
123
157
|
dest_file, FileSystemFileReference
|
|
124
158
|
):
|
|
125
159
|
raise IncompatibleFileReferenceError()
|
|
126
|
-
self.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
160
|
+
self._move_object(src_file.filepath, dest_file.filepath)
|
|
161
|
+
|
|
162
|
+
def move_directory(
|
|
163
|
+
self, src_dir: FileSystemObject, dest_dir: FileSystemObject
|
|
164
|
+
) -> None:
|
|
165
|
+
if not isinstance(src_dir, FileSystemFileReference) or not isinstance(
|
|
166
|
+
dest_dir, FileSystemFileReference
|
|
167
|
+
):
|
|
168
|
+
raise IncompatibleFileReferenceError()
|
|
169
|
+
|
|
170
|
+
assert self.bucket is not None, (
|
|
171
|
+
"call to move_directory on uninitialized s3 session"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
src_prefix = _add_slash(src_dir.filepath)
|
|
175
|
+
dest_prefix = _add_slash(dest_dir.filepath)
|
|
176
|
+
for obj in self.bucket.objects.filter(Prefix=src_prefix):
|
|
177
|
+
dest_key = dest_prefix + obj.key[len(src_prefix) :]
|
|
178
|
+
self._move_object(obj.key, dest_key)
|
|
@@ -32,6 +32,17 @@ class FileSystemSession(ABC):
|
|
|
32
32
|
def delete_files(self, filepaths: list[FileSystemObject]) -> None:
|
|
33
33
|
raise NotImplementedError
|
|
34
34
|
|
|
35
|
+
def list_directories(self, dir_path: FileSystemObject) -> list[FileSystemObject]:
|
|
36
|
+
raise NotImplementedError
|
|
37
|
+
|
|
38
|
+
def create_directory(self, dir_path: FileSystemObject) -> None:
|
|
39
|
+
raise NotImplementedError
|
|
40
|
+
|
|
41
|
+
def move_directory(
|
|
42
|
+
self, src_dir: FileSystemObject, dest_dir: FileSystemObject
|
|
43
|
+
) -> None:
|
|
44
|
+
raise NotImplementedError
|
|
45
|
+
|
|
35
46
|
@abstractmethod
|
|
36
47
|
def __enter__(self) -> "FileSystemSession": ...
|
|
37
48
|
|
{uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/core/environment.py
RENAMED
|
@@ -26,10 +26,6 @@ def get_local_admin_server_port() -> int:
|
|
|
26
26
|
return int(os.environ.get("UNC_ADMIN_SERVER_PORT", "50051"))
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
def get_integration_admin_token() -> str | None:
|
|
30
|
-
return os.environ.get("UNC_INTEGRATION_ADMIN_TOKEN")
|
|
31
|
-
|
|
32
|
-
|
|
33
29
|
def get_otel_enabled() -> bool:
|
|
34
30
|
return os.environ.get("UNC_OTEL_ENABLED") == "true"
|
|
35
31
|
|
{uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/entrypoint.py
RENAMED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
from uncountable.integration.db.connect import IntegrationDBService, create_db_engine
|
|
2
2
|
from uncountable.integration.scan_profiles import load_profiles
|
|
3
3
|
from uncountable.integration.server import IntegrationServer
|
|
4
|
+
from uncountable.integration.webhook_bootstrap import start_webhook_entity_bootstrap
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
def main() -> None:
|
|
8
|
+
profiles = load_profiles()
|
|
7
9
|
with IntegrationServer(create_db_engine(IntegrationDBService.CRON)) as server:
|
|
8
|
-
|
|
10
|
+
start_webhook_entity_bootstrap(profiles)
|
|
11
|
+
server.register_jobs(profiles)
|
|
9
12
|
server.serve_forever()
|
|
10
13
|
|
|
11
14
|
|
|
@@ -28,6 +28,10 @@ class HttpException(Exception):
|
|
|
28
28
|
def body_parse_error() -> "HttpException":
|
|
29
29
|
return HttpException(error_code=400, message="body parse error")
|
|
30
30
|
|
|
31
|
+
@staticmethod
|
|
32
|
+
def bad_request(message: str = "bad request") -> "HttpException":
|
|
33
|
+
return HttpException(error_code=400, message=message)
|
|
34
|
+
|
|
31
35
|
@staticmethod
|
|
32
36
|
def unauthorized() -> "HttpException":
|
|
33
37
|
return HttpException(error_code=401, message="unauthorized")
|
{uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/integration/job.py
RENAMED
|
@@ -27,7 +27,7 @@ from uncountable.integration.queue_runner.command_server.types import (
|
|
|
27
27
|
from uncountable.integration.request_context import extract_request_context
|
|
28
28
|
from uncountable.integration.secret_retrieval import retrieve_secret
|
|
29
29
|
from uncountable.integration.telemetry import JobLogger
|
|
30
|
-
from uncountable.integration.
|
|
30
|
+
from uncountable.integration.webhook_entity import (
|
|
31
31
|
webhook_signature_key_retrieval,
|
|
32
32
|
)
|
|
33
33
|
from uncountable.types import (
|
|
@@ -3,9 +3,7 @@ from opentelemetry.trace import get_current_span
|
|
|
3
3
|
from uncountable.integration.construct_client import construct_uncountable_client
|
|
4
4
|
from uncountable.integration.scan_profiles import load_profiles
|
|
5
5
|
from uncountable.integration.telemetry import Logger
|
|
6
|
-
from uncountable.integration.
|
|
7
|
-
bootstrap_webhook_signature_key,
|
|
8
|
-
)
|
|
6
|
+
from uncountable.integration.webhook_entity import create_missing_webhook_entities
|
|
9
7
|
from uncountable.types import job_definition_t
|
|
10
8
|
|
|
11
9
|
|
|
@@ -17,12 +15,10 @@ def provision_webhook(*, job_id: str) -> str | None:
|
|
|
17
15
|
isinstance(job, job_definition_t.UncountableWebhookJobDefinition)
|
|
18
16
|
and job.id == job_id
|
|
19
17
|
):
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
client=client,
|
|
18
|
+
create_missing_webhook_entities(
|
|
19
|
+
client=construct_uncountable_client(profile_metadata, logger),
|
|
23
20
|
profile_metadata=profile_metadata,
|
|
24
|
-
|
|
25
|
-
purpose=job.purpose,
|
|
21
|
+
jobs=[job],
|
|
26
22
|
)
|
|
27
23
|
return profile_metadata.name
|
|
28
24
|
return None
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import threading
|
|
2
|
+
|
|
3
|
+
from opentelemetry.trace import get_current_span
|
|
4
|
+
|
|
5
|
+
from uncountable.integration.construct_client import construct_uncountable_client
|
|
6
|
+
from uncountable.integration.telemetry import Logger
|
|
7
|
+
from uncountable.integration.webhook_entity import create_missing_webhook_entities
|
|
8
|
+
from uncountable.types import job_definition_t
|
|
9
|
+
|
|
10
|
+
_BOOTSTRAP_SCOPE_NAME = "bootstrap_webhook_entities"
|
|
11
|
+
_BOOTSTRAP_THREAD_NAME = "webhook-entity-bootstrap"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _bootstrap_profile_webhook_entities(
|
|
15
|
+
*,
|
|
16
|
+
profile_metadata: job_definition_t.ProfileMetadata,
|
|
17
|
+
jobs: list[job_definition_t.UncountableWebhookJobDefinition],
|
|
18
|
+
logger: Logger,
|
|
19
|
+
) -> None:
|
|
20
|
+
created_job_ids = create_missing_webhook_entities(
|
|
21
|
+
client=construct_uncountable_client(profile_metadata, logger),
|
|
22
|
+
profile_metadata=profile_metadata,
|
|
23
|
+
jobs=jobs,
|
|
24
|
+
)
|
|
25
|
+
logger.log_debug(
|
|
26
|
+
f"bootstrapped {len(created_job_ids)} webhook entities for profile {profile_metadata.name}",
|
|
27
|
+
attributes={
|
|
28
|
+
"profile.name": profile_metadata.name,
|
|
29
|
+
"webhook.created_job_ids": created_job_ids,
|
|
30
|
+
},
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _bootstrap_webhook_entities(
|
|
35
|
+
profiles: list[job_definition_t.ProfileMetadata],
|
|
36
|
+
) -> None:
|
|
37
|
+
logger = Logger(get_current_span())
|
|
38
|
+
with logger.push_scope(_BOOTSTRAP_SCOPE_NAME):
|
|
39
|
+
for profile_metadata in profiles:
|
|
40
|
+
webhook_jobs = [
|
|
41
|
+
job
|
|
42
|
+
for job in profile_metadata.jobs
|
|
43
|
+
if isinstance(job, job_definition_t.UncountableWebhookJobDefinition)
|
|
44
|
+
]
|
|
45
|
+
if len(webhook_jobs) == 0:
|
|
46
|
+
continue
|
|
47
|
+
try:
|
|
48
|
+
_bootstrap_profile_webhook_entities(
|
|
49
|
+
profile_metadata=profile_metadata, jobs=webhook_jobs, logger=logger
|
|
50
|
+
)
|
|
51
|
+
except Exception as e:
|
|
52
|
+
logger.log_exception(
|
|
53
|
+
e,
|
|
54
|
+
message=f"failed to bootstrap webhook entities for profile {profile_metadata.name}",
|
|
55
|
+
attributes={"profile.name": profile_metadata.name},
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def start_webhook_entity_bootstrap(
|
|
60
|
+
profiles: list[job_definition_t.ProfileMetadata],
|
|
61
|
+
) -> None:
|
|
62
|
+
threading.Thread(
|
|
63
|
+
target=_bootstrap_webhook_entities,
|
|
64
|
+
args=(profiles,),
|
|
65
|
+
name=_BOOTSTRAP_THREAD_NAME,
|
|
66
|
+
daemon=True,
|
|
67
|
+
).start()
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import secrets
|
|
2
|
+
from collections.abc import Sequence
|
|
3
|
+
|
|
4
|
+
from uncountable.core.client import Client
|
|
5
|
+
from uncountable.core.query.builder import QueryBuilder
|
|
6
|
+
from uncountable.core.query.column import (
|
|
7
|
+
NullableColumn,
|
|
8
|
+
TextColumn,
|
|
9
|
+
)
|
|
10
|
+
from uncountable.core.query.row import QueryRow
|
|
11
|
+
from uncountable.types import (
|
|
12
|
+
create_or_update_entities_t,
|
|
13
|
+
entity_t,
|
|
14
|
+
field_values_t,
|
|
15
|
+
identifier_t,
|
|
16
|
+
listing_t,
|
|
17
|
+
)
|
|
18
|
+
from uncountable.types.job_definition_t import (
|
|
19
|
+
ProfileMetadata,
|
|
20
|
+
UncountableWebhookJobDefinition,
|
|
21
|
+
)
|
|
22
|
+
from uncountable.types.secret_retrieval_t import SecretRetrievalEntityColumn
|
|
23
|
+
|
|
24
|
+
_WEBHOOK_DEFINITION_REF_NAME = "unc_webhook_definition"
|
|
25
|
+
_WEBHOOK_REF_NAME_FIELD_REF_NAME = "refName"
|
|
26
|
+
_WEBHOOK_NAME_FIELD_REF_NAME = "name"
|
|
27
|
+
_WEBHOOK_URL_FIELD_REF_NAME = "core_webhook_url"
|
|
28
|
+
_WEBHOOK_SIGNATURE_KEY_FIELD_REF_NAME = "core_webhook_signatureKey"
|
|
29
|
+
_WEBHOOK_PURPOSE_FIELD_REF_NAME = "core_webhook_purpose"
|
|
30
|
+
_SIGNATURE_KEY_NUM_BYTES = 32
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class _WebhookEntityQueryRow(QueryRow):
|
|
34
|
+
ref_name = TextColumn(
|
|
35
|
+
identifier=listing_t.ColumnIdentifierEntityRefName(
|
|
36
|
+
entity_type=entity_t.EntityType.WEBHOOK,
|
|
37
|
+
ref_name=_WEBHOOK_REF_NAME_FIELD_REF_NAME,
|
|
38
|
+
),
|
|
39
|
+
nullable=NullableColumn,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def webhook_signature_key_retrieval(*, job_id: str) -> SecretRetrievalEntityColumn:
|
|
44
|
+
return SecretRetrievalEntityColumn(
|
|
45
|
+
entity_key=identifier_t.IdentifierKeyRefName(ref_name=job_id),
|
|
46
|
+
column_identifier=listing_t.ColumnIdentifierEntityRefName(
|
|
47
|
+
entity_type=entity_t.EntityType.WEBHOOK,
|
|
48
|
+
ref_name=_WEBHOOK_SIGNATURE_KEY_FIELD_REF_NAME,
|
|
49
|
+
),
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _resolve_webhook_url(*, profile_metadata: ProfileMetadata, job_id: str) -> str:
|
|
54
|
+
integration_server_base_url = profile_metadata.integration_server_base_url
|
|
55
|
+
if integration_server_base_url is None:
|
|
56
|
+
raise ValueError(
|
|
57
|
+
"integration_server_base_url is required to resolve the webhook entity "
|
|
58
|
+
f"for {profile_metadata.name}/{job_id}"
|
|
59
|
+
)
|
|
60
|
+
return f"{integration_server_base_url.rstrip('/')}/{profile_metadata.name}/{job_id}"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _fetch_existing_webhook_ref_names(
|
|
64
|
+
*, client: Client, job_ids: Sequence[str]
|
|
65
|
+
) -> set[str]:
|
|
66
|
+
existing_webhooks = (
|
|
67
|
+
QueryBuilder(client=client, model=_WebhookEntityQueryRow)
|
|
68
|
+
.filter(_WebhookEntityQueryRow.ref_name.includes(tuple(job_ids)))
|
|
69
|
+
.all()
|
|
70
|
+
)
|
|
71
|
+
return {
|
|
72
|
+
webhook.ref_name
|
|
73
|
+
for webhook in existing_webhooks
|
|
74
|
+
if webhook.ref_name is not None
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _text_field_value(
|
|
79
|
+
*, field_ref_name: str, value: str
|
|
80
|
+
) -> field_values_t.FieldArgumentValue:
|
|
81
|
+
return field_values_t.FieldArgumentValue(
|
|
82
|
+
field_key=identifier_t.IdentifierKeyRefName(ref_name=field_ref_name),
|
|
83
|
+
value=field_values_t.FieldValueText(value=value),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _build_webhook_operation(
|
|
88
|
+
*, profile_metadata: ProfileMetadata, job: UncountableWebhookJobDefinition
|
|
89
|
+
) -> create_or_update_entities_t.EntityToCreateOrUpdate:
|
|
90
|
+
# entity_key is deliberately omitted so the operation always takes the create
|
|
91
|
+
# path. Supplying a ref_name key that resolves to nothing raises not-found
|
|
92
|
+
# rather than creating the entity, and callers only pass jobs already known
|
|
93
|
+
# to have no webhook entity.
|
|
94
|
+
return create_or_update_entities_t.EntityToCreateOrUpdate(
|
|
95
|
+
field_values=[],
|
|
96
|
+
on_create_init_field_values=[
|
|
97
|
+
_text_field_value(
|
|
98
|
+
field_ref_name=_WEBHOOK_REF_NAME_FIELD_REF_NAME, value=job.id
|
|
99
|
+
),
|
|
100
|
+
_text_field_value(
|
|
101
|
+
field_ref_name=_WEBHOOK_NAME_FIELD_REF_NAME,
|
|
102
|
+
value=f"{profile_metadata.name}/{job.id}",
|
|
103
|
+
),
|
|
104
|
+
_text_field_value(
|
|
105
|
+
field_ref_name=_WEBHOOK_URL_FIELD_REF_NAME,
|
|
106
|
+
value=_resolve_webhook_url(
|
|
107
|
+
profile_metadata=profile_metadata, job_id=job.id
|
|
108
|
+
),
|
|
109
|
+
),
|
|
110
|
+
_text_field_value(
|
|
111
|
+
field_ref_name=_WEBHOOK_SIGNATURE_KEY_FIELD_REF_NAME,
|
|
112
|
+
value=secrets.token_urlsafe(_SIGNATURE_KEY_NUM_BYTES),
|
|
113
|
+
),
|
|
114
|
+
field_values_t.FieldArgumentValue(
|
|
115
|
+
field_key=identifier_t.IdentifierKeyRefName(
|
|
116
|
+
ref_name=_WEBHOOK_PURPOSE_FIELD_REF_NAME
|
|
117
|
+
),
|
|
118
|
+
value=field_values_t.FieldValueFieldOption(value=job.purpose.value),
|
|
119
|
+
),
|
|
120
|
+
],
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def create_missing_webhook_entities(
|
|
125
|
+
*,
|
|
126
|
+
client: Client,
|
|
127
|
+
profile_metadata: ProfileMetadata,
|
|
128
|
+
jobs: Sequence[UncountableWebhookJobDefinition],
|
|
129
|
+
) -> list[str]:
|
|
130
|
+
existing_ref_names = _fetch_existing_webhook_ref_names(
|
|
131
|
+
client=client, job_ids=[job.id for job in jobs]
|
|
132
|
+
)
|
|
133
|
+
missing_jobs = [job for job in jobs if job.id not in existing_ref_names]
|
|
134
|
+
if len(missing_jobs) == 0:
|
|
135
|
+
return []
|
|
136
|
+
|
|
137
|
+
client.create_or_update_entities(
|
|
138
|
+
entity_type=entity_t.EntityType.WEBHOOK,
|
|
139
|
+
definition_key=identifier_t.IdentifierKeyRefName(
|
|
140
|
+
ref_name=_WEBHOOK_DEFINITION_REF_NAME
|
|
141
|
+
),
|
|
142
|
+
operations=[
|
|
143
|
+
_build_webhook_operation(profile_metadata=profile_metadata, job=job)
|
|
144
|
+
for job in missing_jobs
|
|
145
|
+
],
|
|
146
|
+
)
|
|
147
|
+
return [job.id for job in missing_jobs]
|
|
@@ -12,7 +12,6 @@ from uncountable.integration.http_server import GenericHttpRequest, HttpExceptio
|
|
|
12
12
|
from uncountable.integration.job import CustomHttpJob, WebhookJob
|
|
13
13
|
from uncountable.integration.scan_profiles import load_profiles
|
|
14
14
|
from uncountable.integration.telemetry import Logger
|
|
15
|
-
from uncountable.integration.webhook_server.admin_routes import register_admin_routes
|
|
16
15
|
from uncountable.types import job_definition_t
|
|
17
16
|
|
|
18
17
|
app = flask.Flask(__name__)
|
|
@@ -99,7 +98,6 @@ def register_route(
|
|
|
99
98
|
|
|
100
99
|
def main() -> None:
|
|
101
100
|
app.add_url_rule("/health", "health", lambda: ("OK", 200))
|
|
102
|
-
register_admin_routes(app)
|
|
103
101
|
|
|
104
102
|
profiles = load_profiles()
|
|
105
103
|
for profile_metadata in profiles:
|
|
@@ -21,7 +21,7 @@ __all__: list[str] = [
|
|
|
21
21
|
|
|
22
22
|
ENDPOINT_METHOD = "POST"
|
|
23
23
|
ENDPOINT_PATH = "api/external/recipes/external_set_recipe_inputs"
|
|
24
|
-
ENDPOINT_DESCRIPTION = "Sets input values for experiments. Supports numeric, text, and categorical types. Validates that the recipe step belongs to the correct recipe.
|
|
24
|
+
ENDPOINT_DESCRIPTION = "Sets input values for experiments. Supports numeric, text, and categorical types. Validates that the recipe step belongs to the correct recipe. Each entry edits one input on one recipe with a single operation: set the value (the actual value when set_actual_value is true, otherwise the set value), associate a lot (lot_recipe_id, created if the recipe is not already a lot), or remove the input (remove). A lot association targets the set value; combining it with set_actual_value fails. Writes all values to the first workflow step when no step is specified. Fails if both a numeric and string value are provided."
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
# DO NOT MODIFY -- This file is generated by type_spec
|
{uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/client_base.py
RENAMED
|
@@ -2177,7 +2177,7 @@ class ClientMethods(ABC):
|
|
|
2177
2177
|
input_data: list[set_recipe_inputs_t.RecipeInputValue],
|
|
2178
2178
|
_request_options: client_config_t.RequestOptions | None = None,
|
|
2179
2179
|
) -> set_recipe_inputs_t.Data:
|
|
2180
|
-
"""Sets input values for experiments. Supports numeric, text, and categorical types. Validates that the recipe step belongs to the correct recipe.
|
|
2180
|
+
"""Sets input values for experiments. Supports numeric, text, and categorical types. Validates that the recipe step belongs to the correct recipe. Each entry edits one input on one recipe with a single operation: set the value (the actual value when set_actual_value is true, otherwise the set value), associate a lot (lot_recipe_id, created if the recipe is not already a lot), or remove the input (remove). A lot association targets the set value; combining it with set_actual_value fails. Writes all values to the first workflow step when no step is specified. Fails if both a numeric and string value are provided.
|
|
2181
2181
|
|
|
2182
2182
|
:param input_data: The inputs to set. Must be at most 100 entries long
|
|
2183
2183
|
"""
|
{uncountablepythonsdk-0.0.181 → uncountablepythonsdk-0.0.183}/uncountable/types/generic_upload.py
RENAMED
|
@@ -9,6 +9,7 @@ from .generic_upload_t import UploadDestinationBase as UploadDestinationBase
|
|
|
9
9
|
from .generic_upload_t import UploadDestinationProject as UploadDestinationProject
|
|
10
10
|
from .generic_upload_t import UploadDestinationMaterialFamily as UploadDestinationMaterialFamily
|
|
11
11
|
from .generic_upload_t import UploadDestinationRecipe as UploadDestinationRecipe
|
|
12
|
+
from .generic_upload_t import UploadDestinationAutoMatch as UploadDestinationAutoMatch
|
|
12
13
|
from .generic_upload_t import UploadDestination as UploadDestination
|
|
13
14
|
from .generic_upload_t import GenericUploadStrategy as GenericUploadStrategy
|
|
14
15
|
# DO NOT MODIFY -- This file is generated by type_spec
|