UncountablePythonSDK 0.0.64__tar.gz → 0.0.66__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.
Potentially problematic release.
This version of UncountablePythonSDK might be problematic. Click here for more details.
- {uncountablepythonsdk-0.0.64/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.66}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/UncountablePythonSDK.egg-info/SOURCES.txt +1 -0
- uncountablepythonsdk-0.0.66/uncountable/integration/cli.py +74 -0
- uncountablepythonsdk-0.0.66/uncountable/integration/cron.py +45 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/scan_profiles.py +5 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/server.py +2 -1
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/telemetry.py +11 -12
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/webhook_server/entrypoint.py +27 -21
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/set_input_category.py +1 -1
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/edit_recipe_inputs.py +17 -2
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/client_base.py +2 -2
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/inputs.py +1 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/inputs_t.py +17 -0
- uncountablepythonsdk-0.0.64/uncountable/integration/cron.py +0 -43
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/.github/workflows/documentation.yml +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/.github/workflows/publish.yml +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/.gitignore +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/README.md +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/UncountablePythonSDK.egg-info/requires.txt +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/.gitignore +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/conf.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/index.md +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/justfile +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/quickstart.md +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/requirements.txt +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/android-chrome-192x192.png +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/android-chrome-512x512.png +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/apple-touch-icon.png +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/browserconfig.xml +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/favicon-16x16.png +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/favicon-32x32.png +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/manifest.json +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/mstile-150x150.png +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/safari-pinned-tab.svg +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/logo_blue.png +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/examples/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/examples/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/examples/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/examples/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/examples/upload_files.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/_is_enum.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/_is_namedtuple.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/argument_parser.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/case_convert.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/_local_session.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/_s3_session.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/_sftp_session.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/file_type_utils.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/filesystem_session.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/py.typed +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/missing_sentry.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/opaque_key.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/serial_class.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/serial_union.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/yaml.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization_util/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization_util/serialization_helpers.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/strenum_compat/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/strenum_compat/strenum_compat.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/actions_registry/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/actions_registry/__main__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/builder.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/config.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/emit_io_ts.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/emit_open_api.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/emit_open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/emit_typescript_util.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/load_types.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/parts/base.py.prepart +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/parts/base.ts.prepart +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/test.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/type_info/__main__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/util.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/value_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/value_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/value_spec/convert_type.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/value_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/type_spec/value_spec/types.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pyproject.toml +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/setup.cfg +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/core/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/core/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/core/client.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/core/environment.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/core/file_upload.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/core/types.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/construct_client.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/db/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/db/connect.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/executors/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/executors/executors.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/executors/generic_upload_executor.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/executors/script_executor.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/job.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/secret_retrieval/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/py.typed +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/batch/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/batch/execute_batch.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/chemical/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/create_entities.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/get_entities_data.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/list_entities.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/lock_entity.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/set_values.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/entity/unlock_entity.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/equipment/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/field_options/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/id_source/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/id_source/list_id_source.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/id_source/match_id_source.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/input_groups/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/create_inputs.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/get_input_data.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/get_input_names.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/material_families/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/outputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/outputs/get_output_data.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/outputs/get_output_names.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/permissions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/project/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/project/get_projects.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/project/get_projects_data.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipe_links/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/archive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/create_recipe.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/create_recipes.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/get_curve.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/lock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/triggers/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/triggers/run_trigger.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/uploader/__init__.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/async_batch_processor.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/async_batch_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/base.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/base_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/calculations.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/calculations_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/chemical_structure.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/chemical_structure_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/client_config.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/client_config_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/curves.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/curves_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/entity.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/entity_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/experiment_groups.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/experiment_groups_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/field_values.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/field_values_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/fields.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/fields_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/generic_upload.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/generic_upload_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/id_source.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/id_source_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/identifier.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/identifier_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/input_attributes.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/input_attributes_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/job_definition.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/job_definition_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/outputs.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/outputs_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/overrides.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/overrides_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/permissions.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/permissions_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/phases.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/phases_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/post_base.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/post_base_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_identifiers.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_identifiers_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_links_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_output_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_tags_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_workflow_steps.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipe_workflow_steps_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipes.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/recipes_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/response.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/response_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/secret_retrieval.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/secret_retrieval_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/units.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/units_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/users.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/users_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/webhook_job.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/webhook_job_t.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/workflows.py +0 -0
- {uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/workflows_t.py +0 -0
{uncountablepythonsdk-0.0.64/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.66}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: UncountablePythonSDK
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.66
|
|
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.64 → uncountablepythonsdk-0.0.66/UncountablePythonSDK.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: UncountablePythonSDK
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.66
|
|
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
|
|
@@ -90,6 +90,7 @@ uncountable/core/environment.py
|
|
|
90
90
|
uncountable/core/file_upload.py
|
|
91
91
|
uncountable/core/types.py
|
|
92
92
|
uncountable/integration/__init__.py
|
|
93
|
+
uncountable/integration/cli.py
|
|
93
94
|
uncountable/integration/construct_client.py
|
|
94
95
|
uncountable/integration/cron.py
|
|
95
96
|
uncountable/integration/entrypoint.py
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
|
|
3
|
+
from opentelemetry.trace import get_current_span
|
|
4
|
+
|
|
5
|
+
from uncountable.core.async_batch import AsyncBatchProcessor
|
|
6
|
+
from uncountable.integration.construct_client import construct_uncountable_client
|
|
7
|
+
from uncountable.integration.executors.executors import execute_job
|
|
8
|
+
from uncountable.integration.job import CronJobArguments
|
|
9
|
+
from uncountable.integration.scan_profiles import load_profiles
|
|
10
|
+
from uncountable.integration.telemetry import JobLogger, Logger
|
|
11
|
+
from uncountable.types import job_definition_t
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def main() -> None:
|
|
15
|
+
logger = Logger(get_current_span())
|
|
16
|
+
|
|
17
|
+
profiles = load_profiles()
|
|
18
|
+
|
|
19
|
+
parser = argparse.ArgumentParser(
|
|
20
|
+
description="Process a job with a given command and job ID."
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
parser.add_argument(
|
|
24
|
+
"command",
|
|
25
|
+
type=str,
|
|
26
|
+
choices=["run"],
|
|
27
|
+
help="The command to execute (e.g., 'run')",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
parser.add_argument("job_id", type=str, help="The ID of the job to process")
|
|
31
|
+
|
|
32
|
+
args = parser.parse_args()
|
|
33
|
+
|
|
34
|
+
with logger.push_scope(args.command):
|
|
35
|
+
if args.command == "run":
|
|
36
|
+
job_result: job_definition_t.JobResult | None = None
|
|
37
|
+
for profile in profiles:
|
|
38
|
+
for job in profile.definition.jobs:
|
|
39
|
+
if job.id == args.job_id:
|
|
40
|
+
profile_meta = job_definition_t.ProfileMetadata(
|
|
41
|
+
name=profile.name,
|
|
42
|
+
base_url=profile.definition.base_url,
|
|
43
|
+
auth_retrieval=profile.definition.auth_retrieval,
|
|
44
|
+
client_options=profile.definition.client_options,
|
|
45
|
+
)
|
|
46
|
+
job_logger = JobLogger(
|
|
47
|
+
base_span=logger.current_span,
|
|
48
|
+
profile_metadata=profile_meta,
|
|
49
|
+
job_definition=job,
|
|
50
|
+
)
|
|
51
|
+
client = construct_uncountable_client(
|
|
52
|
+
profile_meta=profile_meta, job_logger=job_logger
|
|
53
|
+
)
|
|
54
|
+
batch_processor = AsyncBatchProcessor(client=client)
|
|
55
|
+
job_args = CronJobArguments(
|
|
56
|
+
job_definition=job,
|
|
57
|
+
profile_metadata=profile_meta,
|
|
58
|
+
client=client,
|
|
59
|
+
batch_processor=batch_processor,
|
|
60
|
+
logger=job_logger,
|
|
61
|
+
)
|
|
62
|
+
job_result = execute_job(
|
|
63
|
+
job_definition=job,
|
|
64
|
+
profile_metadata=profile_meta,
|
|
65
|
+
args=job_args,
|
|
66
|
+
)
|
|
67
|
+
break
|
|
68
|
+
if job_result is None:
|
|
69
|
+
raise Exception(f"no such job id {args.job_id}")
|
|
70
|
+
else:
|
|
71
|
+
parser.print_usage()
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
main()
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from pkgs.argument_parser import CachedParser
|
|
4
|
+
from uncountable.core.async_batch import AsyncBatchProcessor
|
|
5
|
+
from uncountable.integration.construct_client import construct_uncountable_client
|
|
6
|
+
from uncountable.integration.executors.executors import execute_job
|
|
7
|
+
from uncountable.integration.job import CronJobArguments
|
|
8
|
+
from uncountable.integration.telemetry import JobLogger, get_otel_tracer
|
|
9
|
+
from uncountable.types.job_definition_t import JobDefinition, ProfileMetadata
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class CronJobArgs:
|
|
14
|
+
definition: JobDefinition
|
|
15
|
+
profile_metadata: ProfileMetadata
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
cron_args_parser = CachedParser(CronJobArgs)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def cron_job_executor(**kwargs: dict) -> None:
|
|
22
|
+
args_passed = cron_args_parser.parse_storage(kwargs)
|
|
23
|
+
with get_otel_tracer().start_as_current_span(name="cron_executor") as span:
|
|
24
|
+
job_logger = JobLogger(
|
|
25
|
+
base_span=span,
|
|
26
|
+
profile_metadata=args_passed.profile_metadata,
|
|
27
|
+
job_definition=args_passed.definition,
|
|
28
|
+
)
|
|
29
|
+
client = construct_uncountable_client(
|
|
30
|
+
profile_meta=args_passed.profile_metadata, job_logger=job_logger
|
|
31
|
+
)
|
|
32
|
+
batch_processor = AsyncBatchProcessor(client=client)
|
|
33
|
+
args = CronJobArguments(
|
|
34
|
+
job_definition=args_passed.definition,
|
|
35
|
+
client=client,
|
|
36
|
+
batch_processor=batch_processor,
|
|
37
|
+
profile_metadata=args_passed.profile_metadata,
|
|
38
|
+
logger=job_logger,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
execute_job(
|
|
42
|
+
args=args,
|
|
43
|
+
profile_metadata=args_passed.profile_metadata,
|
|
44
|
+
job_definition=args_passed.definition,
|
|
45
|
+
)
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/scan_profiles.py
RENAMED
|
@@ -20,6 +20,7 @@ def load_profiles() -> list[ProfileDetails]:
|
|
|
20
20
|
entry for entry in resources.files(profiles_module).iterdir() if entry.is_dir()
|
|
21
21
|
]
|
|
22
22
|
profile_details: list[ProfileDetails] = []
|
|
23
|
+
seen_job_ids: set[str] = set()
|
|
23
24
|
for profile_file in profiles:
|
|
24
25
|
profile_name = profile_file.name
|
|
25
26
|
try:
|
|
@@ -27,6 +28,10 @@ def load_profiles() -> list[ProfileDetails]:
|
|
|
27
28
|
package=".".join([profiles_module, profile_name]),
|
|
28
29
|
resource="profile.yaml",
|
|
29
30
|
)
|
|
31
|
+
for job in definition.jobs:
|
|
32
|
+
if job.id in seen_job_ids:
|
|
33
|
+
raise Exception(f"multiple jobs with id {job.id}")
|
|
34
|
+
seen_job_ids.add(job.id)
|
|
30
35
|
profile_details.append(
|
|
31
36
|
ProfileDetails(name=profile_name, definition=definition)
|
|
32
37
|
)
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/server.py
RENAMED
|
@@ -8,6 +8,7 @@ from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
|
|
|
8
8
|
from apscheduler.schedulers.background import BackgroundScheduler
|
|
9
9
|
from apscheduler.schedulers.base import BaseScheduler
|
|
10
10
|
from apscheduler.triggers.cron import CronTrigger
|
|
11
|
+
from opentelemetry.trace import get_current_span
|
|
11
12
|
from sqlalchemy.engine.base import Engine
|
|
12
13
|
|
|
13
14
|
from uncountable.integration.cron import CronJobArgs, cron_job_executor
|
|
@@ -37,7 +38,7 @@ class IntegrationServer:
|
|
|
37
38
|
jobstores={"default": SQLAlchemyJobStore(engine=engine)},
|
|
38
39
|
executors={"default": ThreadPoolExecutor(_MAX_APSCHEDULER_CONCURRENT_JOBS)},
|
|
39
40
|
)
|
|
40
|
-
self._server_logger = Logger()
|
|
41
|
+
self._server_logger = Logger(get_current_span())
|
|
41
42
|
|
|
42
43
|
def register_profile(
|
|
43
44
|
self,
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/integration/telemetry.py
RENAMED
|
@@ -74,18 +74,17 @@ class LogSeverity(StrEnum):
|
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
class Logger:
|
|
77
|
-
current_span: Span
|
|
77
|
+
current_span: Span
|
|
78
|
+
|
|
79
|
+
def __init__(self, base_span: Span) -> None:
|
|
80
|
+
self.current_span = base_span
|
|
78
81
|
|
|
79
82
|
@property
|
|
80
|
-
def current_span_id(self) -> int
|
|
81
|
-
if self.current_span is None:
|
|
82
|
-
return None
|
|
83
|
+
def current_span_id(self) -> int:
|
|
83
84
|
return self.current_span.get_span_context().span_id
|
|
84
85
|
|
|
85
86
|
@property
|
|
86
87
|
def current_trace_id(self) -> int | None:
|
|
87
|
-
if self.current_span is None:
|
|
88
|
-
return None
|
|
89
88
|
return self.current_span.get_span_context().trace_id
|
|
90
89
|
|
|
91
90
|
def _patch_attributes(self, attributes: Attributes | None) -> Attributes:
|
|
@@ -134,10 +133,9 @@ class Logger:
|
|
|
134
133
|
) -> None:
|
|
135
134
|
traceback_str = "".join(traceback.format_tb(exception.__traceback__))
|
|
136
135
|
patched_attributes = self._patch_attributes(attributes)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
)
|
|
136
|
+
self.current_span.record_exception(
|
|
137
|
+
exception=exception, attributes=patched_attributes
|
|
138
|
+
)
|
|
141
139
|
self.log_error(
|
|
142
140
|
message=f"error: {message}\nexception: {exception}{traceback_str}",
|
|
143
141
|
attributes=patched_attributes,
|
|
@@ -149,8 +147,7 @@ class Logger:
|
|
|
149
147
|
) -> Generator[typing.Self, None, None]:
|
|
150
148
|
with get_otel_tracer().start_as_current_span(
|
|
151
149
|
scope_name, attributes=self._patch_attributes(attributes)
|
|
152
|
-
)
|
|
153
|
-
self.current_span = span
|
|
150
|
+
):
|
|
154
151
|
yield self
|
|
155
152
|
|
|
156
153
|
|
|
@@ -158,11 +155,13 @@ class JobLogger(Logger):
|
|
|
158
155
|
def __init__(
|
|
159
156
|
self,
|
|
160
157
|
*,
|
|
158
|
+
base_span: Span,
|
|
161
159
|
profile_metadata: job_definition_t.ProfileMetadata,
|
|
162
160
|
job_definition: job_definition_t.JobDefinition,
|
|
163
161
|
) -> None:
|
|
164
162
|
self.profile_metadata = profile_metadata
|
|
165
163
|
self.job_definition = job_definition
|
|
164
|
+
super().__init__(base_span)
|
|
166
165
|
|
|
167
166
|
def _patch_attributes(self, attributes: Attributes | None) -> Attributes:
|
|
168
167
|
patched_attributes: dict[str, base_t.JsonValue] = {
|
|
@@ -5,6 +5,7 @@ import flask
|
|
|
5
5
|
import simplejson
|
|
6
6
|
from flask.typing import ResponseReturnValue
|
|
7
7
|
from flask.wrappers import Response
|
|
8
|
+
from opentelemetry.trace import get_current_span
|
|
8
9
|
from uncountable.core.async_batch import AsyncBatchProcessor
|
|
9
10
|
from uncountable.core.environment import get_integration_env, get_webhook_server_port
|
|
10
11
|
from uncountable.integration.construct_client import construct_uncountable_client
|
|
@@ -12,7 +13,7 @@ from uncountable.integration.executors.executors import execute_job
|
|
|
12
13
|
from uncountable.integration.job import WebhookJobArguments
|
|
13
14
|
from uncountable.integration.scan_profiles import load_profiles
|
|
14
15
|
from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
|
|
15
|
-
from uncountable.integration.telemetry import JobLogger, Logger
|
|
16
|
+
from uncountable.integration.telemetry import JobLogger, Logger, get_otel_tracer
|
|
16
17
|
from uncountable.types import job_definition_t, webhook_job_t
|
|
17
18
|
|
|
18
19
|
from pkgs.argument_parser import CachedParser
|
|
@@ -109,26 +110,31 @@ def register_route(
|
|
|
109
110
|
passed_signature=passed_signature,
|
|
110
111
|
)
|
|
111
112
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
profile_meta=profile_meta, job_logger=job_logger
|
|
117
|
-
)
|
|
118
|
-
execute_job(
|
|
119
|
-
job_definition=job,
|
|
120
|
-
profile_metadata=profile_meta,
|
|
121
|
-
args=WebhookJobArguments(
|
|
122
|
-
job_definition=job,
|
|
113
|
+
with get_otel_tracer().start_as_current_span(
|
|
114
|
+
"webhook_executor"
|
|
115
|
+
) as span:
|
|
116
|
+
job_logger = JobLogger(
|
|
123
117
|
profile_metadata=profile_metadata,
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
118
|
+
job_definition=job,
|
|
119
|
+
base_span=span,
|
|
120
|
+
)
|
|
121
|
+
client = construct_uncountable_client(
|
|
122
|
+
profile_meta=profile_meta, job_logger=job_logger
|
|
123
|
+
)
|
|
124
|
+
execute_job(
|
|
125
|
+
job_definition=job,
|
|
126
|
+
profile_metadata=profile_meta,
|
|
127
|
+
args=WebhookJobArguments(
|
|
128
|
+
job_definition=job,
|
|
129
|
+
profile_metadata=profile_metadata,
|
|
130
|
+
client=client,
|
|
131
|
+
batch_processor=AsyncBatchProcessor(client=client),
|
|
132
|
+
logger=job_logger,
|
|
133
|
+
payload=webhook_payload,
|
|
134
|
+
),
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
return flask.jsonify(WebhookResponse())
|
|
132
138
|
except WebhookException as e:
|
|
133
139
|
server_logger.log_exception(e)
|
|
134
140
|
return e.make_error_response()
|
|
@@ -141,7 +147,7 @@ def register_route(
|
|
|
141
147
|
|
|
142
148
|
profiles = load_profiles()
|
|
143
149
|
for profile in profiles:
|
|
144
|
-
server_logger = Logger()
|
|
150
|
+
server_logger = Logger(get_current_span())
|
|
145
151
|
profile_metadata = job_definition_t.ProfileMetadata(
|
|
146
152
|
name=profile.name,
|
|
147
153
|
auth_retrieval=profile.definition.auth_retrieval,
|
|
@@ -26,7 +26,7 @@ ENDPOINT_PATH = "api/external/inputs/external_set_input_category"
|
|
|
26
26
|
@dataclasses.dataclass(kw_only=True)
|
|
27
27
|
class Arguments:
|
|
28
28
|
input_key: identifier_t.IdentifierKey
|
|
29
|
-
category_id: int
|
|
29
|
+
category_id: typing.Optional[int]
|
|
30
30
|
material_family_ids: typing.Optional[list[int]] = None
|
|
31
31
|
|
|
32
32
|
|
|
@@ -12,6 +12,7 @@ import dataclasses
|
|
|
12
12
|
from pkgs.serialization import serial_class
|
|
13
13
|
from pkgs.serialization import serial_union_annotation
|
|
14
14
|
from ... import identifier_t
|
|
15
|
+
from ... import inputs_t
|
|
15
16
|
from ... import recipe_inputs_t
|
|
16
17
|
from ... import recipe_workflow_steps_t
|
|
17
18
|
|
|
@@ -29,6 +30,7 @@ __all__: list[str] = [
|
|
|
29
30
|
"RecipeInputEditClearInputs",
|
|
30
31
|
"RecipeInputEditInputBase",
|
|
31
32
|
"RecipeInputEditSetLot",
|
|
33
|
+
"RecipeInputEditSetRole",
|
|
32
34
|
"RecipeInputEditType",
|
|
33
35
|
"RecipeInputEditUpdateAnnotations",
|
|
34
36
|
"RecipeInputEditUpsertInput",
|
|
@@ -47,6 +49,7 @@ class RecipeInputEditType(StrEnum):
|
|
|
47
49
|
SET_LOT = "set_lot"
|
|
48
50
|
CHANGE_BASIS = "change_basis"
|
|
49
51
|
ADD_INSTRUCTIONS = "add_instructions"
|
|
52
|
+
SET_ROLE = "set_role"
|
|
50
53
|
|
|
51
54
|
|
|
52
55
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -75,6 +78,7 @@ class RecipeInputEditInputBase(RecipeInputEditBase):
|
|
|
75
78
|
input_value_type: recipe_inputs_t.InputValueType = recipe_inputs_t.InputValueType.VALUE
|
|
76
79
|
value_numeric: typing.Optional[Decimal] = None
|
|
77
80
|
value_str: typing.Optional[str] = None
|
|
81
|
+
behavior: typing.Optional[inputs_t.IngredientBehavior] = None
|
|
78
82
|
calculation_key: typing.Optional[identifier_t.IdentifierKey] = None
|
|
79
83
|
|
|
80
84
|
|
|
@@ -145,14 +149,24 @@ class AnnotationEdit:
|
|
|
145
149
|
@dataclasses.dataclass(kw_only=True)
|
|
146
150
|
class RecipeInputEditUpdateAnnotations(RecipeInputEditInputBase):
|
|
147
151
|
type: typing.Literal[RecipeInputEditType.UPDATE_ANNOTATIONS] = RecipeInputEditType.UPDATE_ANNOTATIONS
|
|
148
|
-
ingredient_key: identifier_t.IdentifierKey
|
|
149
152
|
clear_first: bool
|
|
150
153
|
annotations: list[AnnotationEdit]
|
|
151
154
|
|
|
152
155
|
|
|
156
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
157
|
+
@serial_class(
|
|
158
|
+
parse_require={"type"},
|
|
159
|
+
)
|
|
160
|
+
@dataclasses.dataclass(kw_only=True)
|
|
161
|
+
class RecipeInputEditSetRole(RecipeInputEditBase):
|
|
162
|
+
type: typing.Literal[RecipeInputEditType.SET_ROLE] = RecipeInputEditType.SET_ROLE
|
|
163
|
+
ingredient_key: identifier_t.IdentifierKey
|
|
164
|
+
ingredient_role_key: typing.Optional[identifier_t.IdentifierKey]
|
|
165
|
+
|
|
166
|
+
|
|
153
167
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
154
168
|
RecipeInputEdit = typing.Annotated[
|
|
155
|
-
typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations, RecipeInputEditSetLot, RecipeInputEditChangeBasisViewed, RecipeInputEditAddInstructions],
|
|
169
|
+
typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations, RecipeInputEditSetLot, RecipeInputEditChangeBasisViewed, RecipeInputEditAddInstructions, RecipeInputEditSetRole],
|
|
156
170
|
serial_union_annotation(
|
|
157
171
|
discriminator="type",
|
|
158
172
|
discriminator_map={
|
|
@@ -163,6 +177,7 @@ RecipeInputEdit = typing.Annotated[
|
|
|
163
177
|
"set_lot": RecipeInputEditSetLot,
|
|
164
178
|
"change_basis": RecipeInputEditChangeBasisViewed,
|
|
165
179
|
"add_instructions": RecipeInputEditAddInstructions,
|
|
180
|
+
"set_role": RecipeInputEditSetRole,
|
|
166
181
|
},
|
|
167
182
|
),
|
|
168
183
|
]
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/uncountable/types/client_base.py
RENAMED
|
@@ -1193,13 +1193,13 @@ class ClientMethods(ABC):
|
|
|
1193
1193
|
self,
|
|
1194
1194
|
*,
|
|
1195
1195
|
input_key: identifier_t.IdentifierKey,
|
|
1196
|
-
category_id: int,
|
|
1196
|
+
category_id: typing.Optional[int],
|
|
1197
1197
|
material_family_ids: typing.Optional[list[int]] = None,
|
|
1198
1198
|
) -> set_input_category_t.Data:
|
|
1199
1199
|
"""Sets subcategories for an input
|
|
1200
1200
|
|
|
1201
1201
|
:param input_key: Identifier for the input
|
|
1202
|
-
:param category_id: The
|
|
1202
|
+
:param category_id: The category identifier to set. Null unsets the current category.
|
|
1203
1203
|
:param material_family_ids: The material families to perform the update in
|
|
1204
1204
|
"""
|
|
1205
1205
|
args = set_input_category_t.Arguments(
|
|
@@ -6,5 +6,6 @@
|
|
|
6
6
|
# Kept only for SDK backwards compatibility
|
|
7
7
|
from .inputs_t import IngredientQuantityType as IngredientQuantityType
|
|
8
8
|
from .inputs_t import IngredientType as IngredientType
|
|
9
|
+
from .inputs_t import IngredientBehavior as IngredientBehavior
|
|
9
10
|
from .inputs_t import SimpleInput as SimpleInput
|
|
10
11
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -13,6 +13,7 @@ from pkgs.serialization import serial_string_enum
|
|
|
13
13
|
from . import base_t
|
|
14
14
|
|
|
15
15
|
__all__: list[str] = [
|
|
16
|
+
"IngredientBehavior",
|
|
16
17
|
"IngredientQuantityType",
|
|
17
18
|
"IngredientType",
|
|
18
19
|
"SimpleInput",
|
|
@@ -50,6 +51,22 @@ class IngredientType(StrEnum):
|
|
|
50
51
|
EQUIPMENT = "equipment"
|
|
51
52
|
|
|
52
53
|
|
|
54
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
55
|
+
@serial_string_enum(
|
|
56
|
+
labels={
|
|
57
|
+
"included": "Included",
|
|
58
|
+
"use_quantity": "Use Quantity",
|
|
59
|
+
"not_included": "Not Included",
|
|
60
|
+
"autofill": "Autofill",
|
|
61
|
+
},
|
|
62
|
+
)
|
|
63
|
+
class IngredientBehavior(StrEnum):
|
|
64
|
+
INCLUDED = "included"
|
|
65
|
+
USE_QUANTITY = "use_quantity"
|
|
66
|
+
NOT_INCLUDED = "not_included"
|
|
67
|
+
AUTOFILL = "autofill"
|
|
68
|
+
|
|
69
|
+
|
|
53
70
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
54
71
|
@dataclasses.dataclass(kw_only=True)
|
|
55
72
|
class SimpleInput:
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
|
|
3
|
-
from pkgs.argument_parser import CachedParser
|
|
4
|
-
from uncountable.core.async_batch import AsyncBatchProcessor
|
|
5
|
-
from uncountable.integration.construct_client import construct_uncountable_client
|
|
6
|
-
from uncountable.integration.executors.executors import execute_job
|
|
7
|
-
from uncountable.integration.job import CronJobArguments
|
|
8
|
-
from uncountable.integration.telemetry import JobLogger
|
|
9
|
-
from uncountable.types.job_definition_t import JobDefinition, ProfileMetadata
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@dataclass
|
|
13
|
-
class CronJobArgs:
|
|
14
|
-
definition: JobDefinition
|
|
15
|
-
profile_metadata: ProfileMetadata
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
cron_args_parser = CachedParser(CronJobArgs)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def cron_job_executor(**kwargs: dict) -> None:
|
|
22
|
-
args_passed = cron_args_parser.parse_storage(kwargs)
|
|
23
|
-
job_logger = JobLogger(
|
|
24
|
-
profile_metadata=args_passed.profile_metadata,
|
|
25
|
-
job_definition=args_passed.definition,
|
|
26
|
-
)
|
|
27
|
-
client = construct_uncountable_client(
|
|
28
|
-
profile_meta=args_passed.profile_metadata, job_logger=job_logger
|
|
29
|
-
)
|
|
30
|
-
batch_processor = AsyncBatchProcessor(client=client)
|
|
31
|
-
args = CronJobArguments(
|
|
32
|
-
job_definition=args_passed.definition,
|
|
33
|
-
client=client,
|
|
34
|
-
batch_processor=batch_processor,
|
|
35
|
-
profile_metadata=args_passed.profile_metadata,
|
|
36
|
-
logger=job_logger,
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
execute_job(
|
|
40
|
-
args=args,
|
|
41
|
-
profile_metadata=args_passed.profile_metadata,
|
|
42
|
-
job_definition=args_passed.definition,
|
|
43
|
-
)
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/.github/workflows/documentation.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/browserconfig.xml
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/favicon-16x16.png
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/favicon-32x32.png
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/manifest.json
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/docs/static/favicons/mstile-150x150.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/__init__.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/_is_enum.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/_is_namedtuple.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/argument_parser.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/argument_parser/case_convert.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/__init__.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/_gdrive_session.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/_local_session.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/_s3_session.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/_sftp_session.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/filesystem_utils/file_type_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/missing_sentry.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/opaque_key.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/serial_class.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization/serial_union.py
RENAMED
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/serialization_util/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.64 → uncountablepythonsdk-0.0.66}/pkgs/strenum_compat/strenum_compat.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|