UncountablePythonSDK 0.0.33__tar.gz → 0.0.35__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.33 → uncountablepythonsdk-0.0.35}/.github/workflows/publish.yml +1 -1
- {uncountablepythonsdk-0.0.33/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.35}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/UncountablePythonSDK.egg-info/SOURCES.txt +3 -0
- uncountablepythonsdk-0.0.35/examples/edit_recipe_inputs.py +45 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization_util/serialization_helpers.py +66 -19
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/emit_typescript_util.py +2 -2
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/__init__.py +4 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/list_entities.py +1 -1
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/id_source/match_id_source.py +0 -4
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/edit_recipe_inputs.py +27 -1
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/get_recipes_data.py +0 -3
- uncountablepythonsdk-0.0.35/uncountable/types/api/recipes/lock_recipes.py +89 -0
- uncountablepythonsdk-0.0.35/uncountable/types/api/recipes/set_recipe_output_annotations.py +102 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/client_base.py +42 -2
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/.github/workflows/documentation.yml +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/.gitignore +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/README.md +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/UncountablePythonSDK.egg-info/requires.txt +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/.gitignore +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/conf.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/index.md +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/justfile +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/quickstart.md +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/requirements.txt +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/android-chrome-192x192.png +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/android-chrome-512x512.png +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/apple-touch-icon.png +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/browserconfig.xml +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/favicon-16x16.png +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/favicon-32x32.png +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/manifest.json +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/mstile-150x150.png +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/favicons/safari-pinned-tab.svg +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/docs/static/logo_blue.png +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/examples/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/examples/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/examples/upload_files.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/argument_parser/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/argument_parser/_is_enum.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/argument_parser/_is_namedtuple.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/argument_parser/argument_parser.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/argument_parser/case_convert.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization/missing_sentry.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization/opaque_key.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization/serial_class.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization/serial_union.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization_util/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/strenum_compat/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/strenum_compat/strenum_compat.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/actions_registry/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/actions_registry/__main__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/builder.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/config.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/emit_io_ts.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/emit_open_api.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/emit_open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/load_types.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/parts/base.py.prepart +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/parts/base.ts.prepart +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/test.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/type_info/__main__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/util.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/value_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/value_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/value_spec/convert_type.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/value_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/value_spec/types.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pyproject.toml +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/setup.cfg +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/core/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/core/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/core/client.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/core/file_upload.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/core/types.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/construct_client.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/cron.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/db/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/db/connect.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/executors/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/executors/script_executor.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/job.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/server.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/integration/types.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/py.typed +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/batch/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/batch/execute_batch.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/chemical/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/create_entities.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/get_entities_data.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/lock_entity.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/set_values.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/entity/unlock_entity.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/field_options/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/id_source/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/id_source/list_id_source.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/input_groups/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/create_inputs.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/get_input_data.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/get_input_names.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/set_input_category.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/material_families/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/outputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/outputs/get_output_data.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/outputs/get_output_names.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/permissions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/project/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/project/get_projects.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/project/get_projects_data.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipe_links/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/archive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/create_recipe.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/create_recipes.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/get_curve.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/triggers/__init__.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/api/triggers/run_trigger.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/async_batch_processor.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/base.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/calculations.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/chemical_structure.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/curves.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/entity.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/experiment_groups.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/field_values.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/fields.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/id_source.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/identifier.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/input_attributes.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/inputs.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/outputs.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/permissions.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/phases.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/post_base.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/recipe_identifiers.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/recipe_workflow_steps.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/recipes.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/response.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/units.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/users.py +0 -0
- {uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/workflows.py +0 -0
{uncountablepythonsdk-0.0.33/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.35}/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.35
|
|
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.33 → uncountablepythonsdk-0.0.35/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.35
|
|
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
|
|
@@ -26,6 +26,7 @@ docs/static/favicons/mstile-150x150.png
|
|
|
26
26
|
docs/static/favicons/safari-pinned-tab.svg
|
|
27
27
|
examples/async_batch.py
|
|
28
28
|
examples/create_entity.py
|
|
29
|
+
examples/edit_recipe_inputs.py
|
|
29
30
|
examples/upload_files.py
|
|
30
31
|
pkgs/__init__.py
|
|
31
32
|
pkgs/argument_parser/__init__.py
|
|
@@ -182,9 +183,11 @@ uncountable/types/api/recipes/get_recipe_links.py
|
|
|
182
183
|
uncountable/types/api/recipes/get_recipe_names.py
|
|
183
184
|
uncountable/types/api/recipes/get_recipe_output_metadata.py
|
|
184
185
|
uncountable/types/api/recipes/get_recipes_data.py
|
|
186
|
+
uncountable/types/api/recipes/lock_recipes.py
|
|
185
187
|
uncountable/types/api/recipes/remove_recipe_from_project.py
|
|
186
188
|
uncountable/types/api/recipes/set_recipe_inputs.py
|
|
187
189
|
uncountable/types/api/recipes/set_recipe_metadata.py
|
|
190
|
+
uncountable/types/api/recipes/set_recipe_output_annotations.py
|
|
188
191
|
uncountable/types/api/recipes/set_recipe_outputs.py
|
|
189
192
|
uncountable/types/api/recipes/set_recipe_tags.py
|
|
190
193
|
uncountable/types/api/recipes/unarchive_recipes.py
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from decimal import Decimal
|
|
3
|
+
|
|
4
|
+
from uncountable.core import AsyncBatchProcessor, AuthDetailsApiKey, Client
|
|
5
|
+
from uncountable.types import (
|
|
6
|
+
edit_recipe_inputs_t,
|
|
7
|
+
recipe_workflow_steps_t,
|
|
8
|
+
)
|
|
9
|
+
from uncountable.types.identifier import IdentifierKeyBatchReference, IdentifierKeyId
|
|
10
|
+
from uncountable.types.recipe_identifiers import (
|
|
11
|
+
RecipeIdentifiers,
|
|
12
|
+
)
|
|
13
|
+
from uncountable.types.recipe_inputs import QuantityBasis
|
|
14
|
+
|
|
15
|
+
client = Client(
|
|
16
|
+
base_url=os.environ["UNC_BASE_URL"],
|
|
17
|
+
auth_details=AuthDetailsApiKey(
|
|
18
|
+
api_id=os.environ["UNC_API_ID"], api_secret_key=os.environ["UNC_API_SECRET_KEY"]
|
|
19
|
+
),
|
|
20
|
+
)
|
|
21
|
+
batch_loader = AsyncBatchProcessor(client=client)
|
|
22
|
+
recipe_identifiers: RecipeIdentifiers = []
|
|
23
|
+
req = batch_loader.create_recipe(
|
|
24
|
+
material_family_id=1, workflow_id=1, identifiers=recipe_identifiers
|
|
25
|
+
)
|
|
26
|
+
created_recipe_reference = req.batch_reference
|
|
27
|
+
edits: list[edit_recipe_inputs_t.RecipeInputEdit] = []
|
|
28
|
+
edits.append(
|
|
29
|
+
edit_recipe_inputs_t.RecipeInputEditAddInput(
|
|
30
|
+
quantity_basis=QuantityBasis.MASS,
|
|
31
|
+
ingredient_key=IdentifierKeyId(id=1),
|
|
32
|
+
value_numeric=Decimal(56.7),
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
edits.append(
|
|
36
|
+
edit_recipe_inputs_t.RecipeInputEditChangeBasisViewed(
|
|
37
|
+
quantity_basis=QuantityBasis.VOLUME, ingredient_key=IdentifierKeyId(id=1)
|
|
38
|
+
)
|
|
39
|
+
)
|
|
40
|
+
batch_loader.edit_recipe_inputs(
|
|
41
|
+
recipe_key=IdentifierKeyBatchReference(reference=created_recipe_reference),
|
|
42
|
+
edits=edits,
|
|
43
|
+
recipe_workflow_step_identifier=recipe_workflow_steps_t.RecipeWorkflowStepIdentifierDefault(),
|
|
44
|
+
)
|
|
45
|
+
job_id = batch_loader.send()
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
# warnings -- types here assume that keys to dictionaries are strings
|
|
2
|
+
# this is true most of the time, but there are cases where we have integer indexes
|
|
3
|
+
|
|
4
|
+
import dataclasses
|
|
1
5
|
import datetime
|
|
2
6
|
import enum
|
|
7
|
+
import functools
|
|
3
8
|
from collections.abc import Callable, Mapping, Sequence
|
|
4
9
|
from decimal import Decimal
|
|
5
10
|
from typing import (
|
|
@@ -39,14 +44,25 @@ def identity(x: T) -> T:
|
|
|
39
44
|
return x
|
|
40
45
|
|
|
41
46
|
|
|
42
|
-
|
|
47
|
+
@overload
|
|
48
|
+
def key_convert_to_camelcase(o: str) -> str: ...
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@overload
|
|
52
|
+
def key_convert_to_camelcase(o: int) -> int: ...
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def key_convert_to_camelcase(o: Any) -> str | int:
|
|
43
56
|
if isinstance(o, OpaqueKey):
|
|
44
57
|
return o
|
|
45
|
-
if isinstance(o, enum.
|
|
46
|
-
return o.value
|
|
58
|
+
if isinstance(o, enum.StrEnum):
|
|
59
|
+
return o.value
|
|
47
60
|
if isinstance(o, str):
|
|
48
61
|
return snake_to_camel_case(o)
|
|
49
|
-
|
|
62
|
+
if isinstance(o, int):
|
|
63
|
+
# we allow dictionaries to use integer keys
|
|
64
|
+
return o
|
|
65
|
+
raise ValueError("Unexpected key type", o)
|
|
50
66
|
|
|
51
67
|
|
|
52
68
|
def _convert_dict(d: dict[str, Any]) -> dict[str, JsonValue]:
|
|
@@ -61,27 +77,50 @@ def _serialize_dict(d: dict[str, Any]) -> dict[str, JsonValue]:
|
|
|
61
77
|
return {k: serialize_for_storage(v) for k, v in d.items() if v != MISSING_SENTRY}
|
|
62
78
|
|
|
63
79
|
|
|
64
|
-
def
|
|
65
|
-
|
|
66
|
-
|
|
80
|
+
def _to_string_value(value: Any) -> str:
|
|
81
|
+
assert isinstance(value, (Decimal, int))
|
|
82
|
+
return str(value)
|
|
67
83
|
|
|
68
|
-
|
|
84
|
+
|
|
85
|
+
@dataclasses.dataclass(kw_only=True)
|
|
86
|
+
class DataclassConversions:
|
|
87
|
+
key_conversions: dict[str, str]
|
|
88
|
+
value_conversion_functions: dict[str, Callable[[Any], JsonValue]]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@functools.lru_cache(maxsize=10000)
|
|
92
|
+
def _get_dataclass_conversion_lookups(dataclass_type: Any) -> DataclassConversions:
|
|
93
|
+
scd = get_serial_class_data(dataclass_type)
|
|
94
|
+
|
|
95
|
+
key_conversions: dict[str, str] = {}
|
|
96
|
+
value_conversion_functions: dict[str, Callable[[Any], JsonValue]] = {}
|
|
97
|
+
|
|
98
|
+
for field in dataclasses.fields(dataclass_type):
|
|
99
|
+
key = field.name
|
|
69
100
|
if scd.has_unconverted_key(key):
|
|
70
|
-
|
|
71
|
-
|
|
101
|
+
key_conversions[key] = key
|
|
102
|
+
else:
|
|
103
|
+
key_conversions[key] = key_convert_to_camelcase(key)
|
|
72
104
|
|
|
73
|
-
def value_convert(key: str, value: Any) -> JsonValue:
|
|
74
105
|
if scd.has_to_string_value(key):
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
106
|
+
value_conversion_functions[key] = _to_string_value
|
|
107
|
+
elif scd.has_unconverted_value(key):
|
|
108
|
+
value_conversion_functions[key] = identity
|
|
109
|
+
else:
|
|
110
|
+
value_conversion_functions[key] = serialize_for_api
|
|
111
|
+
|
|
112
|
+
return DataclassConversions(
|
|
113
|
+
key_conversions=key_conversions,
|
|
114
|
+
value_conversion_functions=value_conversion_functions,
|
|
115
|
+
)
|
|
116
|
+
|
|
82
117
|
|
|
118
|
+
def _convert_dataclass(d: Any) -> dict[str, JsonValue]:
|
|
119
|
+
conversions = _get_dataclass_conversion_lookups(type(d)) # type: ignore[arg-type]
|
|
83
120
|
return {
|
|
84
|
-
|
|
121
|
+
conversions.key_conversions[k]: (
|
|
122
|
+
conversions.value_conversion_functions[k](v) if v is not None else None
|
|
123
|
+
)
|
|
85
124
|
for k, v in d.__dict__.items()
|
|
86
125
|
if v != MISSING_SENTRY
|
|
87
126
|
}
|
|
@@ -126,6 +165,10 @@ def serialize_for_api(obj: Any) -> JsonValue:
|
|
|
126
165
|
Use the CachedParser.parse_api to parse this data.
|
|
127
166
|
"""
|
|
128
167
|
serialization_type = get_serialization_type(type(obj)) # type: ignore
|
|
168
|
+
if (
|
|
169
|
+
serialization_type == SerializationType.UNKNOWN
|
|
170
|
+
): # performance optimization to not do function lookup
|
|
171
|
+
return obj # type: ignore
|
|
129
172
|
return _CONVERSION_SERIALIZATION_FUNCS[serialization_type](obj)
|
|
130
173
|
|
|
131
174
|
|
|
@@ -153,6 +196,10 @@ def serialize_for_storage(obj: Any) -> JsonValue:
|
|
|
153
196
|
Use the CachedParser.parse_storage to parse this data.
|
|
154
197
|
"""
|
|
155
198
|
serialization_type = get_serialization_type(type(obj)) # type: ignore
|
|
199
|
+
if (
|
|
200
|
+
serialization_type == SerializationType.UNKNOWN
|
|
201
|
+
): # performance optimization to not do function lookup
|
|
202
|
+
return obj # type: ignore
|
|
156
203
|
return _SERIALIZATION_FUNCS[serialization_type](obj)
|
|
157
204
|
|
|
158
205
|
|
{uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/pkgs/type_spec/emit_typescript_util.py
RENAMED
|
@@ -18,7 +18,7 @@ class EmitTypescriptContext:
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def ts_type_name(name: str) -> str:
|
|
21
|
-
return "".join([x.
|
|
21
|
+
return "".join([x.title() for x in name.split("_")])
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def resolve_namespace_ref(namespace: builder.SpecNamespace) -> str:
|
|
@@ -29,4 +29,4 @@ def ts_name(name: str, name_case: builder.NameCase) -> str:
|
|
|
29
29
|
if name_case == builder.NameCase.preserve:
|
|
30
30
|
return name
|
|
31
31
|
bits = util.split_any_name(name)
|
|
32
|
-
return "".join([bits[0], *[x.
|
|
32
|
+
return "".join([bits[0], *[x.title() for x in bits[1:]]])
|
|
@@ -50,6 +50,7 @@ from . import inputs as inputs_t
|
|
|
50
50
|
from .api.entity import list_entities as list_entities_t
|
|
51
51
|
from .api.id_source import list_id_source as list_id_source_t
|
|
52
52
|
from .api.entity import lock_entity as lock_entity_t
|
|
53
|
+
from .api.recipes import lock_recipes as lock_recipes_t
|
|
53
54
|
from .api.id_source import match_id_source as match_id_source_t
|
|
54
55
|
from . import outputs as outputs_t
|
|
55
56
|
from . import permissions as permissions_t
|
|
@@ -75,6 +76,7 @@ from .api.inputs import set_input_subcategories as set_input_subcategories_t
|
|
|
75
76
|
from .api.inputs import set_intermediate_type as set_intermediate_type_t
|
|
76
77
|
from .api.recipes import set_recipe_inputs as set_recipe_inputs_t
|
|
77
78
|
from .api.recipes import set_recipe_metadata as set_recipe_metadata_t
|
|
79
|
+
from .api.recipes import set_recipe_output_annotations as set_recipe_output_annotations_t
|
|
78
80
|
from .api.recipes import set_recipe_outputs as set_recipe_outputs_t
|
|
79
81
|
from .api.recipes import set_recipe_tags as set_recipe_tags_t
|
|
80
82
|
from .api.entity import set_values as set_values_t
|
|
@@ -136,6 +138,7 @@ __all__: list[str] = [
|
|
|
136
138
|
"list_entities_t",
|
|
137
139
|
"list_id_source_t",
|
|
138
140
|
"lock_entity_t",
|
|
141
|
+
"lock_recipes_t",
|
|
139
142
|
"match_id_source_t",
|
|
140
143
|
"outputs_t",
|
|
141
144
|
"permissions_t",
|
|
@@ -161,6 +164,7 @@ __all__: list[str] = [
|
|
|
161
164
|
"set_intermediate_type_t",
|
|
162
165
|
"set_recipe_inputs_t",
|
|
163
166
|
"set_recipe_metadata_t",
|
|
167
|
+
"set_recipe_output_annotations_t",
|
|
164
168
|
"set_recipe_outputs_t",
|
|
165
169
|
"set_recipe_tags_t",
|
|
166
170
|
"set_values_t",
|
|
@@ -32,8 +32,8 @@ ENDPOINT_PATH = "api/external/entity/external_list_entities"
|
|
|
32
32
|
)
|
|
33
33
|
@dataclass(kw_only=True)
|
|
34
34
|
class Arguments:
|
|
35
|
-
entity_type: entity_t.EntityType
|
|
36
35
|
config_reference: str
|
|
36
|
+
entity_type: typing.Optional[entity_t.EntityType] = None
|
|
37
37
|
attributes: typing.Optional[dict[OpaqueKey, base_t.JsonValue]] = None
|
|
38
38
|
offset: typing.Optional[typing.Optional[int]] = None
|
|
39
39
|
limit: typing.Optional[typing.Optional[int]] = None
|
|
@@ -8,7 +8,6 @@ import typing # noqa: F401
|
|
|
8
8
|
import datetime # noqa: F401
|
|
9
9
|
from decimal import Decimal # noqa: F401
|
|
10
10
|
from dataclasses import dataclass
|
|
11
|
-
from pkgs.serialization import serial_class
|
|
12
11
|
from ... import base as base_t
|
|
13
12
|
from ... import id_source as id_source_t
|
|
14
13
|
|
|
@@ -39,9 +38,6 @@ class Match:
|
|
|
39
38
|
|
|
40
39
|
|
|
41
40
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
42
|
-
@serial_class(
|
|
43
|
-
unconverted_values={"results"},
|
|
44
|
-
)
|
|
45
41
|
@dataclass(kw_only=True)
|
|
46
42
|
class Data:
|
|
47
43
|
results: list[Match]
|
|
@@ -24,8 +24,10 @@ __all__: list[str] = [
|
|
|
24
24
|
"RecipeInputEdit",
|
|
25
25
|
"RecipeInputEditAddInput",
|
|
26
26
|
"RecipeInputEditBase",
|
|
27
|
+
"RecipeInputEditChangeBasisViewed",
|
|
27
28
|
"RecipeInputEditClearInputs",
|
|
28
29
|
"RecipeInputEditInputBase",
|
|
30
|
+
"RecipeInputEditSetLot",
|
|
29
31
|
"RecipeInputEditType",
|
|
30
32
|
"RecipeInputEditUpdateAnnotations",
|
|
31
33
|
"RecipeInputEditUpsertInput",
|
|
@@ -41,6 +43,8 @@ class RecipeInputEditType(StrEnum):
|
|
|
41
43
|
UPSERT_INPUT = "upsert_input"
|
|
42
44
|
ADD_INPUT = "add_input"
|
|
43
45
|
UPDATE_ANNOTATIONS = "update_annotations"
|
|
46
|
+
SET_LOT = "set_lot"
|
|
47
|
+
CHANGE_BASIS = "change_basis"
|
|
44
48
|
|
|
45
49
|
|
|
46
50
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -72,6 +76,15 @@ class RecipeInputEditInputBase(RecipeInputEditBase):
|
|
|
72
76
|
calculation_key: typing.Optional[identifier_t.IdentifierKey] = None
|
|
73
77
|
|
|
74
78
|
|
|
79
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
80
|
+
@serial_class(
|
|
81
|
+
parse_require={"type"},
|
|
82
|
+
)
|
|
83
|
+
@dataclass(kw_only=True)
|
|
84
|
+
class RecipeInputEditChangeBasisViewed(RecipeInputEditInputBase):
|
|
85
|
+
type: typing.Literal[RecipeInputEditType.CHANGE_BASIS] = RecipeInputEditType.CHANGE_BASIS
|
|
86
|
+
|
|
87
|
+
|
|
75
88
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
76
89
|
@serial_class(
|
|
77
90
|
parse_require={"type"},
|
|
@@ -91,6 +104,17 @@ class RecipeInputEditAddInput(RecipeInputEditInputBase):
|
|
|
91
104
|
type: typing.Literal[RecipeInputEditType.ADD_INPUT] = RecipeInputEditType.ADD_INPUT
|
|
92
105
|
|
|
93
106
|
|
|
107
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
108
|
+
@serial_class(
|
|
109
|
+
parse_require={"type"},
|
|
110
|
+
)
|
|
111
|
+
@dataclass(kw_only=True)
|
|
112
|
+
class RecipeInputEditSetLot(RecipeInputEditBase):
|
|
113
|
+
type: typing.Literal[RecipeInputEditType.SET_LOT] = RecipeInputEditType.SET_LOT
|
|
114
|
+
ingredient_key: identifier_t.IdentifierKey
|
|
115
|
+
ingredient_lot_recipe_key: identifier_t.IdentifierKey
|
|
116
|
+
|
|
117
|
+
|
|
94
118
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
95
119
|
@serial_class(
|
|
96
120
|
to_string_values={"lower_value", "upper_value"},
|
|
@@ -116,7 +140,7 @@ class RecipeInputEditUpdateAnnotations(RecipeInputEditInputBase):
|
|
|
116
140
|
|
|
117
141
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
118
142
|
RecipeInputEdit = typing.Annotated[
|
|
119
|
-
typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations],
|
|
143
|
+
typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations, RecipeInputEditSetLot, RecipeInputEditChangeBasisViewed],
|
|
120
144
|
serial_union_annotation(
|
|
121
145
|
discriminator="type",
|
|
122
146
|
discriminator_map={
|
|
@@ -124,6 +148,8 @@ RecipeInputEdit = typing.Annotated[
|
|
|
124
148
|
"upsert_input": RecipeInputEditUpsertInput,
|
|
125
149
|
"add_input": RecipeInputEditAddInput,
|
|
126
150
|
"update_annotations": RecipeInputEditUpdateAnnotations,
|
|
151
|
+
"set_lot": RecipeInputEditSetLot,
|
|
152
|
+
"change_basis": RecipeInputEditChangeBasisViewed,
|
|
127
153
|
},
|
|
128
154
|
),
|
|
129
155
|
]
|
|
@@ -15,7 +15,6 @@ from ... import inputs as inputs_t
|
|
|
15
15
|
from ... import outputs as outputs_t
|
|
16
16
|
from ... import recipe_metadata as recipe_metadata_t
|
|
17
17
|
from ... import recipe_tags as recipe_tags_t
|
|
18
|
-
from ... import users as users_t
|
|
19
18
|
from ... import workflows as workflows_t
|
|
20
19
|
|
|
21
20
|
__all__: list[str] = [
|
|
@@ -97,7 +96,6 @@ class RecipeInput:
|
|
|
97
96
|
quantity_json: base_t.JsonValue
|
|
98
97
|
curve_id: typing.Optional[base_t.ObjectId]
|
|
99
98
|
actual_quantity_json: base_t.JsonValue
|
|
100
|
-
input_type: str
|
|
101
99
|
behavior: str
|
|
102
100
|
quantity_dec: typing.Optional[Decimal] = None
|
|
103
101
|
actual_quantity_dec: typing.Optional[Decimal] = None
|
|
@@ -170,7 +168,6 @@ class Data:
|
|
|
170
168
|
inputs: list[inputs_t.SimpleInput]
|
|
171
169
|
outputs: list[outputs_t.SimpleOutput]
|
|
172
170
|
output_conditions: list[SimpleOutputCondition]
|
|
173
|
-
users: list[users_t.SimpleUser]
|
|
174
171
|
recipe_tags: list[recipe_tags_t.SimpleRecipeTag]
|
|
175
172
|
experiment_groups: list[experiment_groups_t.SimpleExperimentGroup]
|
|
176
173
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -0,0 +1,89 @@
|
|
|
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 pkgs.strenum_compat import StrEnum
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from pkgs.serialization import serial_class
|
|
13
|
+
from pkgs.serialization import serial_union_annotation
|
|
14
|
+
from ... import identifier as identifier_t
|
|
15
|
+
|
|
16
|
+
__all__: list[str] = [
|
|
17
|
+
"Arguments",
|
|
18
|
+
"Data",
|
|
19
|
+
"ENDPOINT_METHOD",
|
|
20
|
+
"ENDPOINT_PATH",
|
|
21
|
+
"RecipeLock",
|
|
22
|
+
"RecipeLockAll",
|
|
23
|
+
"RecipeLockBase",
|
|
24
|
+
"RecipeLockInputs",
|
|
25
|
+
"RecipeLockType",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
ENDPOINT_METHOD = "POST"
|
|
29
|
+
ENDPOINT_PATH = "api/external/recipes/lock_recipes"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
33
|
+
class RecipeLockType(StrEnum):
|
|
34
|
+
ALL = "all"
|
|
35
|
+
INPUTS_ONLY = "inputs_only"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
39
|
+
@dataclass(kw_only=True)
|
|
40
|
+
class RecipeLockBase:
|
|
41
|
+
recipe: identifier_t.IdentifierKey
|
|
42
|
+
globally_removable: bool
|
|
43
|
+
type: RecipeLockType
|
|
44
|
+
lock_samples: typing.Optional[bool] = None
|
|
45
|
+
comments: typing.Optional[str] = None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
49
|
+
@serial_class(
|
|
50
|
+
parse_require={"type"},
|
|
51
|
+
)
|
|
52
|
+
@dataclass(kw_only=True)
|
|
53
|
+
class RecipeLockAll(RecipeLockBase):
|
|
54
|
+
type: typing.Literal[RecipeLockType.ALL] = RecipeLockType.ALL
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
58
|
+
@serial_class(
|
|
59
|
+
parse_require={"type"},
|
|
60
|
+
)
|
|
61
|
+
@dataclass(kw_only=True)
|
|
62
|
+
class RecipeLockInputs(RecipeLockBase):
|
|
63
|
+
type: typing.Literal[RecipeLockType.INPUTS_ONLY] = RecipeLockType.INPUTS_ONLY
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
67
|
+
RecipeLock = typing.Annotated[
|
|
68
|
+
typing.Union[RecipeLockAll, RecipeLockInputs],
|
|
69
|
+
serial_union_annotation(
|
|
70
|
+
discriminator="type",
|
|
71
|
+
discriminator_map={
|
|
72
|
+
"all": RecipeLockAll,
|
|
73
|
+
"inputs_only": RecipeLockInputs,
|
|
74
|
+
},
|
|
75
|
+
),
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
80
|
+
@dataclass(kw_only=True)
|
|
81
|
+
class Arguments:
|
|
82
|
+
locks: list[RecipeLock]
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
86
|
+
@dataclass(kw_only=True)
|
|
87
|
+
class Data:
|
|
88
|
+
pass
|
|
89
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
@@ -0,0 +1,102 @@
|
|
|
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 pkgs.strenum_compat import StrEnum
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from pkgs.serialization import serial_class
|
|
13
|
+
from pkgs.serialization import serial_union_annotation
|
|
14
|
+
from ... import base as base_t
|
|
15
|
+
from ... import identifier as identifier_t
|
|
16
|
+
|
|
17
|
+
__all__: list[str] = [
|
|
18
|
+
"AnnotationEdit",
|
|
19
|
+
"AnnotationUpdateType",
|
|
20
|
+
"Arguments",
|
|
21
|
+
"Data",
|
|
22
|
+
"ENDPOINT_METHOD",
|
|
23
|
+
"ENDPOINT_PATH",
|
|
24
|
+
"RecipeOutputEditBase",
|
|
25
|
+
"RecipeOutputMergeAnnotations",
|
|
26
|
+
"RecipeOutputReplaceAnnotations",
|
|
27
|
+
"RecipeOutputUpdateAnnotations",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
ENDPOINT_METHOD = "POST"
|
|
31
|
+
ENDPOINT_PATH = "api/external/recipes/set_recipe_output_annotations"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
35
|
+
@serial_class(
|
|
36
|
+
to_string_values={"lower_value", "upper_value"},
|
|
37
|
+
)
|
|
38
|
+
@dataclass(kw_only=True)
|
|
39
|
+
class AnnotationEdit:
|
|
40
|
+
annotation_type_key: identifier_t.IdentifierKey
|
|
41
|
+
lower_value: typing.Optional[Decimal] = None
|
|
42
|
+
upper_value: typing.Optional[Decimal] = None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
46
|
+
class AnnotationUpdateType(StrEnum):
|
|
47
|
+
MERGE = "merge"
|
|
48
|
+
REPLACE = "replace"
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
52
|
+
@dataclass(kw_only=True)
|
|
53
|
+
class RecipeOutputEditBase:
|
|
54
|
+
recipe_id: base_t.ObjectId
|
|
55
|
+
output_id: base_t.ObjectId
|
|
56
|
+
experiment_num: int
|
|
57
|
+
annotations: list[AnnotationEdit]
|
|
58
|
+
condition_id: typing.Optional[base_t.ObjectId] = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
62
|
+
@serial_class(
|
|
63
|
+
parse_require={"type"},
|
|
64
|
+
)
|
|
65
|
+
@dataclass(kw_only=True)
|
|
66
|
+
class RecipeOutputMergeAnnotations(RecipeOutputEditBase):
|
|
67
|
+
type: typing.Literal[AnnotationUpdateType.MERGE] = AnnotationUpdateType.MERGE
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
71
|
+
@serial_class(
|
|
72
|
+
parse_require={"type"},
|
|
73
|
+
)
|
|
74
|
+
@dataclass(kw_only=True)
|
|
75
|
+
class RecipeOutputReplaceAnnotations(RecipeOutputEditBase):
|
|
76
|
+
type: typing.Literal[AnnotationUpdateType.REPLACE] = AnnotationUpdateType.REPLACE
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
80
|
+
RecipeOutputUpdateAnnotations = typing.Annotated[
|
|
81
|
+
typing.Union[RecipeOutputMergeAnnotations, RecipeOutputReplaceAnnotations],
|
|
82
|
+
serial_union_annotation(
|
|
83
|
+
discriminator="type",
|
|
84
|
+
discriminator_map={
|
|
85
|
+
"merge": RecipeOutputMergeAnnotations,
|
|
86
|
+
"replace": RecipeOutputReplaceAnnotations,
|
|
87
|
+
},
|
|
88
|
+
),
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
93
|
+
@dataclass(kw_only=True)
|
|
94
|
+
class Arguments:
|
|
95
|
+
updates: list[RecipeOutputUpdateAnnotations]
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
|
99
|
+
@dataclass(kw_only=True)
|
|
100
|
+
class Data:
|
|
101
|
+
pass
|
|
102
|
+
# DO NOT MODIFY -- This file is generated by type_spec
|
{uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/uncountable/types/client_base.py
RENAMED
|
@@ -49,6 +49,7 @@ from uncountable.types import identifier as identifier_t
|
|
|
49
49
|
import uncountable.types.api.entity.list_entities as list_entities_t
|
|
50
50
|
import uncountable.types.api.id_source.list_id_source as list_id_source_t
|
|
51
51
|
import uncountable.types.api.entity.lock_entity as lock_entity_t
|
|
52
|
+
import uncountable.types.api.recipes.lock_recipes as lock_recipes_t
|
|
52
53
|
import uncountable.types.api.id_source.match_id_source as match_id_source_t
|
|
53
54
|
from uncountable.types import permissions as permissions_t
|
|
54
55
|
from uncountable.types import post_base as post_base_t
|
|
@@ -67,6 +68,7 @@ import uncountable.types.api.inputs.set_input_subcategories as set_input_subcate
|
|
|
67
68
|
import uncountable.types.api.inputs.set_intermediate_type as set_intermediate_type_t
|
|
68
69
|
import uncountable.types.api.recipes.set_recipe_inputs as set_recipe_inputs_t
|
|
69
70
|
import uncountable.types.api.recipes.set_recipe_metadata as set_recipe_metadata_t
|
|
71
|
+
import uncountable.types.api.recipes.set_recipe_output_annotations as set_recipe_output_annotations_t
|
|
70
72
|
import uncountable.types.api.recipes.set_recipe_outputs as set_recipe_outputs_t
|
|
71
73
|
import uncountable.types.api.recipes.set_recipe_tags as set_recipe_tags_t
|
|
72
74
|
import uncountable.types.api.entity.set_values as set_values_t
|
|
@@ -826,15 +828,15 @@ class ClientMethods(ABC):
|
|
|
826
828
|
def list_entities(
|
|
827
829
|
self,
|
|
828
830
|
*,
|
|
829
|
-
entity_type: entity_t.EntityType,
|
|
830
831
|
config_reference: str,
|
|
832
|
+
entity_type: typing.Optional[entity_t.EntityType] = None,
|
|
831
833
|
attributes: typing.Optional[dict[OpaqueKey, base_t.JsonValue]] = None,
|
|
832
834
|
offset: typing.Optional[typing.Optional[int]] = None,
|
|
833
835
|
limit: typing.Optional[typing.Optional[int]] = None,
|
|
834
836
|
) -> list_entities_t.Data:
|
|
835
837
|
"""Uses a structured loading configuration to list entities in the system
|
|
836
838
|
|
|
837
|
-
:param entity_type: The type of the entities requested, e.g. lab_request, recipe
|
|
839
|
+
:param entity_type: DEPRECATED: The type of the entities requested, e.g. lab_request, recipe
|
|
838
840
|
:param config_reference: The configuration reference name for the listing config
|
|
839
841
|
:param attributes: Attributes to pass to the configuration for parameterizing filters
|
|
840
842
|
:param offset: Used for pagination. Pagination is done based on the sorting of the config. [Pagination More Info](#pagination)
|
|
@@ -906,6 +908,25 @@ class ClientMethods(ABC):
|
|
|
906
908
|
)
|
|
907
909
|
return self.do_request(api_request=api_request, return_type=lock_entity_t.Data)
|
|
908
910
|
|
|
911
|
+
def lock_recipes(
|
|
912
|
+
self,
|
|
913
|
+
*,
|
|
914
|
+
locks: list[lock_recipes_t.RecipeLock],
|
|
915
|
+
) -> lock_recipes_t.Data:
|
|
916
|
+
"""Lock experiments. Experiments will require unlocking to be editable. Edits to the experiments are blocked while they are locked.
|
|
917
|
+
|
|
918
|
+
:param locks: The recipe locks to apply, a maximum of 100 can be sent
|
|
919
|
+
"""
|
|
920
|
+
args = lock_recipes_t.Arguments(
|
|
921
|
+
locks=locks,
|
|
922
|
+
)
|
|
923
|
+
api_request = APIRequest(
|
|
924
|
+
method=lock_recipes_t.ENDPOINT_METHOD,
|
|
925
|
+
endpoint=lock_recipes_t.ENDPOINT_PATH,
|
|
926
|
+
args=args,
|
|
927
|
+
)
|
|
928
|
+
return self.do_request(api_request=api_request, return_type=lock_recipes_t.Data)
|
|
929
|
+
|
|
909
930
|
def match_id_source(
|
|
910
931
|
self,
|
|
911
932
|
*,
|
|
@@ -1172,6 +1193,25 @@ class ClientMethods(ABC):
|
|
|
1172
1193
|
)
|
|
1173
1194
|
return self.do_request(api_request=api_request, return_type=set_recipe_metadata_t.Data)
|
|
1174
1195
|
|
|
1196
|
+
def set_recipe_output_annotations(
|
|
1197
|
+
self,
|
|
1198
|
+
*,
|
|
1199
|
+
updates: list[set_recipe_output_annotations_t.RecipeOutputUpdateAnnotations],
|
|
1200
|
+
) -> set_recipe_output_annotations_t.Data:
|
|
1201
|
+
"""Update annotations for an experiments outputs
|
|
1202
|
+
|
|
1203
|
+
:param updates: The output edits to perform. Must be at most 100 entries long
|
|
1204
|
+
"""
|
|
1205
|
+
args = set_recipe_output_annotations_t.Arguments(
|
|
1206
|
+
updates=updates,
|
|
1207
|
+
)
|
|
1208
|
+
api_request = APIRequest(
|
|
1209
|
+
method=set_recipe_output_annotations_t.ENDPOINT_METHOD,
|
|
1210
|
+
endpoint=set_recipe_output_annotations_t.ENDPOINT_PATH,
|
|
1211
|
+
args=args,
|
|
1212
|
+
)
|
|
1213
|
+
return self.do_request(api_request=api_request, return_type=set_recipe_output_annotations_t.Data)
|
|
1214
|
+
|
|
1175
1215
|
def set_recipe_outputs(
|
|
1176
1216
|
self,
|
|
1177
1217
|
*,
|
{uncountablepythonsdk-0.0.33 → uncountablepythonsdk-0.0.35}/.github/workflows/documentation.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|