UncountablePythonSDK 0.0.23__tar.gz → 0.0.25__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.23/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.25}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/UncountablePythonSDK.egg-info/SOURCES.txt +2 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/create_entity.py +4 -4
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/open_api_util.py +13 -4
- uncountablepythonsdk-0.0.25/type_spec/external/api/recipes/archive_recipes.yaml +20 -0
- uncountablepythonsdk-0.0.25/uncountable/core/__init__.py +6 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/core/client.py +83 -20
- uncountablepythonsdk-0.0.25/uncountable/core/types.py +16 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/__init__.py +2 -0
- uncountablepythonsdk-0.0.25/uncountable/types/api/recipes/archive_recipes.py +35 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/async_batch.py +1 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/client_base.py +23 -0
- uncountablepythonsdk-0.0.23/uncountable/core/__init__.py +0 -5
- uncountablepythonsdk-0.0.23/uncountable/core/types.py +0 -22
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/.github/workflows/documentation.yml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/.github/workflows/publish.yml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/.gitignore +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/README.md +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/UncountablePythonSDK.egg-info/requires.txt +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/.gitignore +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/conf.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/index.md +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/justfile +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/quickstart.md +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/requirements.txt +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/android-chrome-192x192.png +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/android-chrome-512x512.png +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/apple-touch-icon.png +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/browserconfig.xml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/favicon-16x16.png +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/favicon-32x32.png +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/manifest.json +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/mstile-150x150.png +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/safari-pinned-tab.svg +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/logo_blue.png +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/recipe-import/importer.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/upload_files.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/_is_enum.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/_is_namedtuple.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/argument_parser.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/case_convert.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/missing_sentry.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/opaque_key.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/serial_class.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization_util/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization_util/serialization_helpers.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/strenum_compat/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/strenum_compat/strenum_compat.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/actions_registry/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/actions_registry/__main__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/builder.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/config.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_io_ts.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_open_api.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_typescript_util.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/load_types.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/parts/base.py.prepart +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/parts/base.ts.prepart +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/test.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/type_info/__main__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/util.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/convert_type.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/types.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pyproject.toml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/setup.cfg +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/batch/execute_batch.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/batch/execute_batch_load_async.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/chemical/convert_chemical_formats.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/create_entities.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/create_entity.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/get_entities_data.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/list_entities.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/resolve_entity_ids.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/set_values.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/transition_entity_phase.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/id_source/list_id_source.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/id_source/match_id_source.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/input_groups/get_input_group_names.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/create_inputs.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/get_input_data.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/get_input_names.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/get_inputs_data.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/outputs/get_output_data.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/outputs/get_output_names.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/permissions/set_core_permissions.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/project/get_projects.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/project/get_projects_data.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipe_links/create_recipe_link.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/associate_recipe_as_input.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/associate_recipe_as_lot.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/create_recipe.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/create_recipes.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/disassociate_recipe_as_input.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/edit_recipe_inputs.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_curve.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipe_links.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipe_names.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipes_data.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/set_recipe_metadata.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/set_recipe_tags.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/triggers/run_trigger.yaml +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/core/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/core/file_upload.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/construct_client.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/cron.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/db/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/db/connect.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/executors/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/executors/script_executor.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/job.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/server.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/types.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/py.typed +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/batch/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/batch/execute_batch.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/chemical/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/create_entities.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/get_entities_data.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/list_entities.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/set_values.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/id_source/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/id_source/list_id_source.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/id_source/match_id_source.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/input_groups/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/create_inputs.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/get_input_data.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/get_input_names.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/outputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/outputs/get_output_data.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/outputs/get_output_names.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/permissions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/project/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/project/get_projects.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/project/get_projects_data.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipe_links/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/create_recipe.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/create_recipes.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_curve.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/triggers/__init__.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/triggers/run_trigger.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/async_batch_processor.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/base.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/calculations.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/chemical_structure.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/curves.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/entity.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/experiment_groups.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/field_values.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/fields.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/id_source.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/identifier.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/input_attributes.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/inputs.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/outputs.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/permissions.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/phases.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/post_base.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_identifiers.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_workflow_steps.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/response.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/units.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/users.py +0 -0
- {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/workflows.py +0 -0
{uncountablepythonsdk-0.0.23/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.25}/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.25
|
|
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.23 → uncountablepythonsdk-0.0.25/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.25
|
|
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
|
|
@@ -95,6 +95,7 @@ type_spec/external/api/project/get_projects.yaml
|
|
|
95
95
|
type_spec/external/api/project/get_projects_data.yaml
|
|
96
96
|
type_spec/external/api/recipe_links/create_recipe_link.yaml
|
|
97
97
|
type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml
|
|
98
|
+
type_spec/external/api/recipes/archive_recipes.yaml
|
|
98
99
|
type_spec/external/api/recipes/associate_recipe_as_input.yaml
|
|
99
100
|
type_spec/external/api/recipes/associate_recipe_as_lot.yaml
|
|
100
101
|
type_spec/external/api/recipes/create_recipe.yaml
|
|
@@ -200,6 +201,7 @@ uncountable/types/api/recipe_links/create_recipe_link.py
|
|
|
200
201
|
uncountable/types/api/recipe_metadata/__init__.py
|
|
201
202
|
uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py
|
|
202
203
|
uncountable/types/api/recipes/__init__.py
|
|
204
|
+
uncountable/types/api/recipes/archive_recipes.py
|
|
203
205
|
uncountable/types/api/recipes/associate_recipe_as_input.py
|
|
204
206
|
uncountable/types/api/recipes/associate_recipe_as_lot.py
|
|
205
207
|
uncountable/types/api/recipes/create_recipe.py
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
from uncountable.core import
|
|
1
|
+
from uncountable.core import Client
|
|
2
|
+
from uncountable.core.client import AuthDetailsOAuth
|
|
2
3
|
from uncountable.types import (
|
|
3
4
|
entity_t,
|
|
4
5
|
field_values_t,
|
|
@@ -7,9 +8,8 @@ from uncountable.types import (
|
|
|
7
8
|
|
|
8
9
|
client = Client(
|
|
9
10
|
base_url="https://app.uncountable.com",
|
|
10
|
-
auth_details=
|
|
11
|
-
|
|
12
|
-
api_secret_key="X",
|
|
11
|
+
auth_details=AuthDetailsOAuth(
|
|
12
|
+
refresh_token="x"
|
|
13
13
|
),
|
|
14
14
|
)
|
|
15
15
|
entities = client.create_entity(
|
|
@@ -174,6 +174,18 @@ class OpenAPIObjectType(OpenAPIType):
|
|
|
174
174
|
|
|
175
175
|
return {"description": desc}
|
|
176
176
|
|
|
177
|
+
def _emit_property(
|
|
178
|
+
self, property_name: str, property_type: OpenAPIType
|
|
179
|
+
) -> dict[str, object]:
|
|
180
|
+
property_info = {
|
|
181
|
+
**property_type.asdict(),
|
|
182
|
+
}
|
|
183
|
+
property_description = self._emit_property_desc(property_name)
|
|
184
|
+
if "$ref" in property_info and "description" in property_description:
|
|
185
|
+
return {"allOf": [property_info, property_description]}
|
|
186
|
+
|
|
187
|
+
return property_info | property_description
|
|
188
|
+
|
|
177
189
|
def asdict(self) -> dict[str, object]:
|
|
178
190
|
return self.add_addl_info({
|
|
179
191
|
"type": "object",
|
|
@@ -183,10 +195,7 @@ class OpenAPIObjectType(OpenAPIType):
|
|
|
183
195
|
if not property_type.nullable
|
|
184
196
|
],
|
|
185
197
|
"properties": {
|
|
186
|
-
property_name:
|
|
187
|
-
**property_type.asdict(),
|
|
188
|
-
}
|
|
189
|
-
| self._emit_property_desc(property_name)
|
|
198
|
+
property_name: self._emit_property(property_name, property_type)
|
|
190
199
|
for property_name, property_type in self.properties.items()
|
|
191
200
|
},
|
|
192
201
|
})
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
$endpoint:
|
|
2
|
+
is_sdk: true
|
|
3
|
+
method: post
|
|
4
|
+
path: ${external}/recipes/archive
|
|
5
|
+
function: main.site.app.external.recipes.archive_recipes.archive_recipes
|
|
6
|
+
desc: Archive the provided recipes and their children
|
|
7
|
+
|
|
8
|
+
Arguments:
|
|
9
|
+
type: Object
|
|
10
|
+
properties:
|
|
11
|
+
recipes:
|
|
12
|
+
type: List<identifier.IdentifierKey>
|
|
13
|
+
desc: Identifier for the recipe
|
|
14
|
+
reason?:
|
|
15
|
+
type: String
|
|
16
|
+
desc: This reason will be written to the audit log archive entry
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
Data:
|
|
20
|
+
type: Object
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from .client import Client
|
|
2
|
+
from .types import AuthDetailsApiKey, AuthDetailsOAuth
|
|
3
|
+
from .file_upload import MediaFileUpload, UploadedFile
|
|
4
|
+
from .async_batch import AsyncBatchProcessor
|
|
5
|
+
|
|
6
|
+
__all__: list[str] = ["AuthDetailsApiKey", "AuthDetailsOAuth", "AsyncBatchProcessor", "Client", "MediaFileUpload", "UploadedFile"]
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import base64
|
|
2
|
+
from datetime import datetime, timedelta
|
|
2
3
|
import json
|
|
3
4
|
import typing
|
|
4
5
|
from dataclasses import dataclass
|
|
@@ -14,7 +15,7 @@ from pkgs.serialization_util.serialization_helpers import JsonValue
|
|
|
14
15
|
from uncountable.types.client_base import APIRequest, ClientMethods
|
|
15
16
|
|
|
16
17
|
from .file_upload import FileUpload, FileUploader, UploadedFile
|
|
17
|
-
from .types import AuthDetails, AuthDetailsApiKey
|
|
18
|
+
from .types import AuthDetails, AuthDetailsApiKey, AuthDetailsOAuth
|
|
18
19
|
|
|
19
20
|
DT = typing.TypeVar("DT")
|
|
20
21
|
|
|
@@ -48,11 +49,13 @@ class HTTPPostRequest(HTTPRequestBase):
|
|
|
48
49
|
HTTPRequest = HTTPPostRequest | HTTPGetRequest
|
|
49
50
|
|
|
50
51
|
|
|
51
|
-
|
|
52
52
|
@dataclass(kw_only=True)
|
|
53
|
-
class ClientConfig
|
|
53
|
+
class ClientConfig:
|
|
54
54
|
allow_insecure_tls: bool = False
|
|
55
|
-
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
OAUTH_REFRESH_WINDOW_SECONDS = 60 * 5
|
|
58
|
+
|
|
56
59
|
|
|
57
60
|
class APIResponseError(BaseException):
|
|
58
61
|
status_code: int
|
|
@@ -107,19 +110,60 @@ class SDKError(BaseException):
|
|
|
107
110
|
return f"internal SDK error, please contact Uncountable support: {self.message}"
|
|
108
111
|
|
|
109
112
|
|
|
113
|
+
@dataclass(kw_only=True)
|
|
114
|
+
class OAuthBearerTokenCache:
|
|
115
|
+
token: str
|
|
116
|
+
expires_at: datetime
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@dataclass(kw_only=True)
|
|
120
|
+
class GetOauthBearerTokenData:
|
|
121
|
+
access_token: str
|
|
122
|
+
expires_in: int
|
|
123
|
+
token_type: str
|
|
124
|
+
scope: str
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
oauth_bearer_token_data_parser = CachedParser(GetOauthBearerTokenData)
|
|
128
|
+
|
|
129
|
+
|
|
110
130
|
class Client(ClientMethods):
|
|
111
131
|
_parser_map: dict[type, CachedParser] = {}
|
|
112
132
|
_auth_details: AuthDetails
|
|
113
133
|
_base_url: str
|
|
114
134
|
_file_uploader: FileUploader
|
|
115
135
|
_cfg: ClientConfig
|
|
136
|
+
_oauth_bearer_token_cache: OAuthBearerTokenCache | None = None
|
|
116
137
|
|
|
117
|
-
def __init__(
|
|
138
|
+
def __init__(
|
|
139
|
+
self,
|
|
140
|
+
*,
|
|
141
|
+
base_url: str,
|
|
142
|
+
auth_details: AuthDetails,
|
|
143
|
+
config: ClientConfig | None = None,
|
|
144
|
+
):
|
|
118
145
|
self._auth_details = auth_details
|
|
119
146
|
self._base_url = base_url
|
|
120
147
|
self._file_uploader = FileUploader(self._base_url, self._auth_details)
|
|
121
148
|
self._cfg = config or ClientConfig()
|
|
122
149
|
|
|
150
|
+
def _get_response_json(self, response: requests.Response) -> dict[str, JsonValue]:
|
|
151
|
+
if response.status_code < 200 or response.status_code > 299:
|
|
152
|
+
extra_details: dict[str, JsonValue] | None = None
|
|
153
|
+
try:
|
|
154
|
+
data = response.json()
|
|
155
|
+
if "error" in data:
|
|
156
|
+
extra_details = data["error"]
|
|
157
|
+
except JSONDecodeError:
|
|
158
|
+
pass
|
|
159
|
+
raise APIResponseError.construct_error(
|
|
160
|
+
status_code=response.status_code, extra_details=extra_details
|
|
161
|
+
)
|
|
162
|
+
try:
|
|
163
|
+
return response.json()
|
|
164
|
+
except JSONDecodeError:
|
|
165
|
+
raise SDKError("unable to process response")
|
|
166
|
+
|
|
123
167
|
def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
|
|
124
168
|
http_request = self._build_http_request(api_request=api_request)
|
|
125
169
|
match http_request:
|
|
@@ -128,7 +172,7 @@ class Client(ClientMethods):
|
|
|
128
172
|
http_request.url,
|
|
129
173
|
headers=http_request.headers,
|
|
130
174
|
params=http_request.query_params,
|
|
131
|
-
verify=not self._cfg.allow_insecure_tls
|
|
175
|
+
verify=not self._cfg.allow_insecure_tls,
|
|
132
176
|
)
|
|
133
177
|
case HTTPPostRequest():
|
|
134
178
|
response = requests.post(
|
|
@@ -136,26 +180,16 @@ class Client(ClientMethods):
|
|
|
136
180
|
headers=http_request.headers,
|
|
137
181
|
data=http_request.body,
|
|
138
182
|
params=http_request.query_params,
|
|
139
|
-
verify=not self._cfg.allow_insecure_tls
|
|
183
|
+
verify=not self._cfg.allow_insecure_tls,
|
|
140
184
|
)
|
|
141
185
|
case _:
|
|
142
186
|
typing.assert_never(http_request)
|
|
143
|
-
|
|
144
|
-
extra_details: dict[str, JsonValue] | None = None
|
|
145
|
-
try:
|
|
146
|
-
data = response.json()
|
|
147
|
-
if "error" in data:
|
|
148
|
-
extra_details = data["error"]
|
|
149
|
-
except JSONDecodeError:
|
|
150
|
-
pass
|
|
151
|
-
raise APIResponseError.construct_error(
|
|
152
|
-
status_code=response.status_code, extra_details=extra_details
|
|
153
|
-
)
|
|
187
|
+
response_data = self._get_response_json(response)
|
|
154
188
|
cached_parser = self._get_cached_parser(return_type)
|
|
155
189
|
try:
|
|
156
|
-
data =
|
|
190
|
+
data = response_data["data"]
|
|
157
191
|
return cached_parser.parse_api(data)
|
|
158
|
-
except ValueError | JSONDecodeError:
|
|
192
|
+
except ValueError | JSONDecodeError | KeyError:
|
|
159
193
|
raise SDKError("unable to process response")
|
|
160
194
|
|
|
161
195
|
def _get_cached_parser(self, data_type: type[DT]) -> CachedParser[DT]:
|
|
@@ -163,6 +197,32 @@ class Client(ClientMethods):
|
|
|
163
197
|
self._parser_map[data_type] = CachedParser(data_type)
|
|
164
198
|
return self._parser_map[data_type]
|
|
165
199
|
|
|
200
|
+
def _get_oauth_bearer_token(self, *, oauth_details: AuthDetailsOAuth) -> str:
|
|
201
|
+
if (
|
|
202
|
+
self._oauth_bearer_token_cache is None
|
|
203
|
+
or (
|
|
204
|
+
self._oauth_bearer_token_cache.expires_at - datetime.now()
|
|
205
|
+
).total_seconds()
|
|
206
|
+
< OAUTH_REFRESH_WINDOW_SECONDS
|
|
207
|
+
):
|
|
208
|
+
refresh_url = urljoin(self._base_url, "/token/get_bearer_token")
|
|
209
|
+
response = requests.post(
|
|
210
|
+
refresh_url,
|
|
211
|
+
data={
|
|
212
|
+
"client_secret": oauth_details.refresh_token,
|
|
213
|
+
"scope": oauth_details.scope,
|
|
214
|
+
"grant_type": "client_credentials",
|
|
215
|
+
},
|
|
216
|
+
)
|
|
217
|
+
data = self._get_response_json(response)
|
|
218
|
+
token_data = oauth_bearer_token_data_parser.parse_storage(data)
|
|
219
|
+
self._oauth_bearer_token_cache = OAuthBearerTokenCache(
|
|
220
|
+
token=token_data.access_token,
|
|
221
|
+
expires_at=datetime.now() + timedelta(seconds=token_data.expires_in),
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
return self._oauth_bearer_token_cache.token
|
|
225
|
+
|
|
166
226
|
def _build_auth_headers(self) -> dict[str, str]:
|
|
167
227
|
match self._auth_details:
|
|
168
228
|
case AuthDetailsApiKey():
|
|
@@ -170,6 +230,9 @@ class Client(ClientMethods):
|
|
|
170
230
|
f"{self._auth_details.api_id}:{self._auth_details.api_secret_key}".encode()
|
|
171
231
|
).decode("utf-8")
|
|
172
232
|
return {"Authorization": f"Basic {encoded}"}
|
|
233
|
+
case AuthDetailsOAuth():
|
|
234
|
+
token = self._get_oauth_bearer_token(oauth_details=self._auth_details)
|
|
235
|
+
return {"Authorization": f"Bearer {token}"}
|
|
173
236
|
typing.assert_never(self._auth_details)
|
|
174
237
|
|
|
175
238
|
def _build_http_request(self, *, api_request: APIRequest) -> HTTPRequest:
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@dataclass(kw_only=True)
|
|
5
|
+
class AuthDetailsApiKey:
|
|
6
|
+
api_id: str
|
|
7
|
+
api_secret_key: str
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(kw_only=True)
|
|
11
|
+
class AuthDetailsOAuth:
|
|
12
|
+
refresh_token: str
|
|
13
|
+
scope: str = "unc.rnd"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
AuthDetails = AuthDetailsApiKey | AuthDetailsOAuth
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
# ruff: noqa: E402
|
|
4
4
|
# fmt: off
|
|
5
5
|
# isort: skip_file
|
|
6
|
+
from .api.recipes import archive_recipes as archive_recipes_t
|
|
6
7
|
from .api.recipes import associate_recipe_as_input as associate_recipe_as_input_t
|
|
7
8
|
from .api.recipes import associate_recipe_as_lot as associate_recipe_as_lot_t
|
|
8
9
|
from . import async_batch as async_batch_t
|
|
@@ -77,6 +78,7 @@ from . import workflows as workflows_t
|
|
|
77
78
|
|
|
78
79
|
|
|
79
80
|
__all__: list[str] = [
|
|
81
|
+
"archive_recipes_t",
|
|
80
82
|
"associate_recipe_as_input_t",
|
|
81
83
|
"associate_recipe_as_lot_t",
|
|
82
84
|
"async_batch_t",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
2
|
+
# flake8: noqa: F821
|
|
3
|
+
# ruff: noqa: E402
|
|
4
|
+
# fmt: off
|
|
5
|
+
# isort: skip_file
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
import typing # noqa: F401
|
|
8
|
+
import datetime # noqa: F401
|
|
9
|
+
from decimal import Decimal # noqa: F401
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from ... import identifier as identifier_t
|
|
12
|
+
|
|
13
|
+
__all__: list[str] = [
|
|
14
|
+
"Arguments",
|
|
15
|
+
"Data",
|
|
16
|
+
"ENDPOINT_METHOD",
|
|
17
|
+
"ENDPOINT_PATH",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
ENDPOINT_METHOD = "POST"
|
|
21
|
+
ENDPOINT_PATH = "api/external/recipes/archive"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
25
|
+
@dataclass(kw_only=True)
|
|
26
|
+
class Arguments:
|
|
27
|
+
recipes: list[identifier_t.IdentifierKey]
|
|
28
|
+
reason: typing.Optional[str] = None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
32
|
+
@dataclass(kw_only=True)
|
|
33
|
+
class Data:
|
|
34
|
+
pass
|
|
35
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/async_batch.py
RENAMED
|
@@ -26,6 +26,7 @@ class AsyncBatchRequestPath(StrEnum):
|
|
|
26
26
|
SET_RECIPE_METADATA = "recipes/set_recipe_metadata"
|
|
27
27
|
SET_RECIPE_TAGS = "recipes/set_recipe_tags"
|
|
28
28
|
EDIT_RECIPE_INPUTS = "recipes/edit_recipe_inputs"
|
|
29
|
+
ARCHIVE_RECIPES = "recipes/archive"
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
# DO NOT MODIFY -- This file is generated by type_spec
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/client_base.py
RENAMED
|
@@ -9,6 +9,7 @@ import typing # noqa: F401
|
|
|
9
9
|
import datetime # noqa: F401
|
|
10
10
|
from decimal import Decimal # noqa: F401
|
|
11
11
|
from pkgs.serialization import OpaqueKey
|
|
12
|
+
import uncountable.types.api.recipes.archive_recipes as archive_recipes_t
|
|
12
13
|
import uncountable.types.api.recipes.associate_recipe_as_input as associate_recipe_as_input_t
|
|
13
14
|
import uncountable.types.api.recipes.associate_recipe_as_lot as associate_recipe_as_lot_t
|
|
14
15
|
from uncountable.types import async_batch as async_batch_t
|
|
@@ -83,6 +84,28 @@ class ClientMethods(ABC):
|
|
|
83
84
|
def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
|
|
84
85
|
...
|
|
85
86
|
|
|
87
|
+
def archive_recipes(
|
|
88
|
+
self,
|
|
89
|
+
*,
|
|
90
|
+
recipes: list[identifier_t.IdentifierKey],
|
|
91
|
+
reason: typing.Optional[str] = None,
|
|
92
|
+
) -> archive_recipes_t.Data:
|
|
93
|
+
"""Archive the provided recipes and their children
|
|
94
|
+
|
|
95
|
+
:param recipes: Identifier for the recipe
|
|
96
|
+
:param reason: This reason will be written to the audit log archive entry
|
|
97
|
+
"""
|
|
98
|
+
args = archive_recipes_t.Arguments(
|
|
99
|
+
recipes=recipes,
|
|
100
|
+
reason=reason,
|
|
101
|
+
)
|
|
102
|
+
api_request = APIRequest(
|
|
103
|
+
method=archive_recipes_t.ENDPOINT_METHOD,
|
|
104
|
+
endpoint=archive_recipes_t.ENDPOINT_PATH,
|
|
105
|
+
args=args,
|
|
106
|
+
)
|
|
107
|
+
return self.do_request(api_request=api_request, return_type=archive_recipes_t.Data)
|
|
108
|
+
|
|
86
109
|
def associate_recipe_as_input(
|
|
87
110
|
self,
|
|
88
111
|
*,
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import base64
|
|
2
|
-
import json
|
|
3
|
-
import typing
|
|
4
|
-
from dataclasses import dataclass
|
|
5
|
-
from enum import StrEnum
|
|
6
|
-
from urllib.parse import urljoin
|
|
7
|
-
|
|
8
|
-
import aiohttp
|
|
9
|
-
import requests
|
|
10
|
-
|
|
11
|
-
from pkgs.argument_parser import CachedParser
|
|
12
|
-
from pkgs.serialization_util import serialize_for_api
|
|
13
|
-
from uncountable.types.client_base import APIRequest, ClientMethods
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass(kw_only=True)
|
|
17
|
-
class AuthDetailsApiKey:
|
|
18
|
-
api_id: str
|
|
19
|
-
api_secret_key: str
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
AuthDetails = AuthDetailsApiKey
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/.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.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/browserconfig.xml
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/favicon-16x16.png
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/favicon-32x32.png
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/manifest.json
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/mstile-150x150.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/recipe-import/importer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/__init__.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/_is_enum.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/_is_namedtuple.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/argument_parser.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/case_convert.py
RENAMED
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/missing_sentry.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/opaque_key.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/serial_class.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization_util/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/strenum_compat/strenum_compat.py
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
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_open_api_util.py
RENAMED
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_typescript.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_typescript_util.py
RENAMED
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/parts/base.py.prepart
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/parts/base.ts.prepart
RENAMED
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/type_info/__main__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/__init__.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/__main__.py
RENAMED
|
File without changes
|
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/emit_python.py
RENAMED
|
File without changes
|
{uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/types.py
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
|