UncountablePythonSDK 0.0.20__tar.gz → 0.0.22__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.20/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.22}/PKG-INFO +3 -1
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22/UncountablePythonSDK.egg-info}/PKG-INFO +3 -1
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/UncountablePythonSDK.egg-info/SOURCES.txt +21 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/UncountablePythonSDK.egg-info/requires.txt +2 -0
- uncountablepythonsdk-0.0.22/examples/async_batch.py +36 -0
- uncountablepythonsdk-0.0.22/examples/upload_files.py +19 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/actions_registry/__main__.py +35 -23
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/actions_registry/emit_typescript.py +71 -9
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/builder.py +125 -8
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/config.py +1 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_open_api.py +197 -16
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_open_api_util.py +18 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_python.py +241 -55
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/load_types.py +48 -5
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/open_api_util.py +13 -33
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/type_info/emit_type_info.py +129 -8
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pyproject.toml +2 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/create_entities.yaml +13 -1
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/create_entity.yaml +13 -1
- uncountablepythonsdk-0.0.22/type_spec/external/api/entity/transition_entity_phase.yaml +44 -0
- uncountablepythonsdk-0.0.22/type_spec/external/api/permissions/set_core_permissions.yaml +69 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/associate_recipe_as_input.yaml +4 -4
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/create_recipe.yaml +2 -1
- uncountablepythonsdk-0.0.22/type_spec/external/api/recipes/disassociate_recipe_as_input.yaml +16 -0
- uncountablepythonsdk-0.0.22/type_spec/external/api/recipes/edit_recipe_inputs.yaml +86 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_curve.yaml +4 -1
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipes_data.yaml +6 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/set_recipe_metadata.yaml +1 -0
- uncountablepythonsdk-0.0.22/type_spec/external/api/recipes/set_recipe_tags.yaml +62 -0
- uncountablepythonsdk-0.0.22/uncountable/core/__init__.py +5 -0
- uncountablepythonsdk-0.0.22/uncountable/core/async_batch.py +22 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/core/client.py +84 -10
- uncountablepythonsdk-0.0.22/uncountable/core/file_upload.py +95 -0
- uncountablepythonsdk-0.0.22/uncountable/core/types.py +22 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/__init__.py +18 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/create_entities.py +1 -1
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/create_entity.py +1 -1
- uncountablepythonsdk-0.0.22/uncountable/types/api/entity/transition_entity_phase.py +66 -0
- uncountablepythonsdk-0.0.22/uncountable/types/api/permissions/set_core_permissions.py +89 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/associate_recipe_as_input.py +4 -3
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/create_recipe.py +1 -1
- uncountablepythonsdk-0.0.22/uncountable/types/api/recipes/disassociate_recipe_as_input.py +35 -0
- uncountablepythonsdk-0.0.22/uncountable/types/api/recipes/edit_recipe_inputs.py +106 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_curve.py +2 -1
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipes_data.py +2 -0
- uncountablepythonsdk-0.0.22/uncountable/types/api/recipes/set_recipe_tags.py +91 -0
- uncountablepythonsdk-0.0.22/uncountable/types/api/triggers/__init__.py +1 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/async_batch.py +10 -0
- uncountablepythonsdk-0.0.22/uncountable/types/async_batch_processor.py +154 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/client_base.py +113 -48
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/identifier.py +3 -3
- uncountablepythonsdk-0.0.22/uncountable/types/permissions.py +46 -0
- uncountablepythonsdk-0.0.22/uncountable/types/post_base.py +30 -0
- uncountablepythonsdk-0.0.22/uncountable/types/recipe_inputs.py +30 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_metadata.py +2 -0
- uncountablepythonsdk-0.0.22/uncountable/types/recipe_workflow_steps.py +77 -0
- uncountablepythonsdk-0.0.20/uncountable/core/__init__.py +0 -3
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/.github/workflows/documentation.yml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/.github/workflows/publish.yml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/.gitignore +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/README.md +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/.gitignore +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/conf.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/index.md +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/justfile +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/quickstart.md +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/requirements.txt +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/android-chrome-192x192.png +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/android-chrome-512x512.png +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/apple-touch-icon.png +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/browserconfig.xml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/favicon-16x16.png +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/favicon-32x32.png +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/manifest.json +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/mstile-150x150.png +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/safari-pinned-tab.svg +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/logo_blue.png +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/examples/create_entity.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/examples/recipe-import/importer.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/_is_enum.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/_is_namedtuple.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/argument_parser.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/case_convert.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization/missing_sentry.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization/opaque_key.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization/serial_class.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization_util/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization_util/serialization_helpers.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/strenum_compat/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/strenum_compat/strenum_compat.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/actions_registry/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_io_ts.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_typescript.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_typescript_util.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/parts/base.py.prepart +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/parts/base.ts.prepart +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/test.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/type_info/__main__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/util.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/convert_type.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/emit_python.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/types.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/setup.cfg +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/batch/execute_batch.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/batch/execute_batch_load_async.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/chemical/convert_chemical_formats.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/get_entities_data.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/list_entities.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/resolve_entity_ids.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/set_values.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/id_source/list_id_source.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/id_source/match_id_source.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/input_groups/get_input_group_names.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/create_inputs.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/get_input_data.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/get_input_names.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/get_inputs_data.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/outputs/get_output_data.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/outputs/get_output_names.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/project/get_projects.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/project/get_projects_data.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipe_links/create_recipe_link.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/associate_recipe_as_lot.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/create_recipes.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipe_links.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipe_names.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/triggers/run_trigger.yaml +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/construct_client.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/cron.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/db/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/db/connect.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/executors/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/executors/script_executor.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/job.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/server.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/types.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/py.typed +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/batch/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/batch/execute_batch.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/chemical/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/get_entities_data.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/list_entities.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/set_values.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/id_source/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/id_source/list_id_source.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/id_source/match_id_source.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/input_groups/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/create_inputs.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/get_input_data.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/get_input_names.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/outputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/outputs/get_output_data.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/outputs/get_output_names.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
- {uncountablepythonsdk-0.0.20/uncountable/types/api/project → uncountablepythonsdk-0.0.22/uncountable/types/api/permissions}/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20/uncountable/types/api/recipe_links → uncountablepythonsdk-0.0.22/uncountable/types/api/project}/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/project/get_projects.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/project/get_projects_data.py +0 -0
- {uncountablepythonsdk-0.0.20/uncountable/types/api/recipe_metadata → uncountablepythonsdk-0.0.22/uncountable/types/api/recipe_links}/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.20/uncountable/types/api/recipes → uncountablepythonsdk-0.0.22/uncountable/types/api/recipe_metadata}/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
- {uncountablepythonsdk-0.0.20/uncountable/types/api/triggers → uncountablepythonsdk-0.0.22/uncountable/types/api/recipes}/__init__.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/create_recipes.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/triggers/run_trigger.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/base.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/calculations.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/chemical_structure.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/curves.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/entity.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/experiment_groups.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/field_values.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/fields.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/id_source.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/input_attributes.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/inputs.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/outputs.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/phases.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_identifiers.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/response.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/units.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/users.py +0 -0
- {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/workflows.py +0 -0
{uncountablepythonsdk-0.0.20/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.22}/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.22
|
|
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
|
|
@@ -16,6 +16,8 @@ Classifier: Topic :: Utilities
|
|
|
16
16
|
Classifier: Typing :: Typed
|
|
17
17
|
Requires-Python: >=3.11
|
|
18
18
|
Description-Content-Type: text/markdown
|
|
19
|
+
Requires-Dist: aiotus==0.1.15
|
|
20
|
+
Requires-Dist: aiohttp==3.9.5
|
|
19
21
|
Requires-Dist: requests==2.31.0
|
|
20
22
|
Requires-Dist: SQLAlchemy==1.4.52
|
|
21
23
|
Requires-Dist: APScheduler==3.10.4
|
{uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22/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.22
|
|
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
|
|
@@ -16,6 +16,8 @@ Classifier: Topic :: Utilities
|
|
|
16
16
|
Classifier: Typing :: Typed
|
|
17
17
|
Requires-Python: >=3.11
|
|
18
18
|
Description-Content-Type: text/markdown
|
|
19
|
+
Requires-Dist: aiotus==0.1.15
|
|
20
|
+
Requires-Dist: aiohttp==3.9.5
|
|
19
21
|
Requires-Dist: requests==2.31.0
|
|
20
22
|
Requires-Dist: SQLAlchemy==1.4.52
|
|
21
23
|
Requires-Dist: APScheduler==3.10.4
|
|
@@ -24,7 +24,9 @@ docs/static/favicons/favicon-32x32.png
|
|
|
24
24
|
docs/static/favicons/manifest.json
|
|
25
25
|
docs/static/favicons/mstile-150x150.png
|
|
26
26
|
docs/static/favicons/safari-pinned-tab.svg
|
|
27
|
+
examples/async_batch.py
|
|
27
28
|
examples/create_entity.py
|
|
29
|
+
examples/upload_files.py
|
|
28
30
|
examples/recipe-import/importer.py
|
|
29
31
|
pkgs/__init__.py
|
|
30
32
|
pkgs/argument_parser/__init__.py
|
|
@@ -76,6 +78,7 @@ type_spec/external/api/entity/get_entities_data.yaml
|
|
|
76
78
|
type_spec/external/api/entity/list_entities.yaml
|
|
77
79
|
type_spec/external/api/entity/resolve_entity_ids.yaml
|
|
78
80
|
type_spec/external/api/entity/set_values.yaml
|
|
81
|
+
type_spec/external/api/entity/transition_entity_phase.yaml
|
|
79
82
|
type_spec/external/api/id_source/list_id_source.yaml
|
|
80
83
|
type_spec/external/api/id_source/match_id_source.yaml
|
|
81
84
|
type_spec/external/api/input_groups/get_input_group_names.yaml
|
|
@@ -87,6 +90,7 @@ type_spec/external/api/inputs/set_input_attribute_values.yaml
|
|
|
87
90
|
type_spec/external/api/outputs/get_output_data.yaml
|
|
88
91
|
type_spec/external/api/outputs/get_output_names.yaml
|
|
89
92
|
type_spec/external/api/outputs/resolve_output_conditions.yaml
|
|
93
|
+
type_spec/external/api/permissions/set_core_permissions.yaml
|
|
90
94
|
type_spec/external/api/project/get_projects.yaml
|
|
91
95
|
type_spec/external/api/project/get_projects_data.yaml
|
|
92
96
|
type_spec/external/api/recipe_links/create_recipe_link.yaml
|
|
@@ -95,6 +99,8 @@ type_spec/external/api/recipes/associate_recipe_as_input.yaml
|
|
|
95
99
|
type_spec/external/api/recipes/associate_recipe_as_lot.yaml
|
|
96
100
|
type_spec/external/api/recipes/create_recipe.yaml
|
|
97
101
|
type_spec/external/api/recipes/create_recipes.yaml
|
|
102
|
+
type_spec/external/api/recipes/disassociate_recipe_as_input.yaml
|
|
103
|
+
type_spec/external/api/recipes/edit_recipe_inputs.yaml
|
|
98
104
|
type_spec/external/api/recipes/get_curve.yaml
|
|
99
105
|
type_spec/external/api/recipes/get_recipe_calculations.yaml
|
|
100
106
|
type_spec/external/api/recipes/get_recipe_links.yaml
|
|
@@ -104,11 +110,15 @@ type_spec/external/api/recipes/get_recipes_data.yaml
|
|
|
104
110
|
type_spec/external/api/recipes/set_recipe_inputs.yaml
|
|
105
111
|
type_spec/external/api/recipes/set_recipe_metadata.yaml
|
|
106
112
|
type_spec/external/api/recipes/set_recipe_outputs.yaml
|
|
113
|
+
type_spec/external/api/recipes/set_recipe_tags.yaml
|
|
107
114
|
type_spec/external/api/triggers/run_trigger.yaml
|
|
108
115
|
uncountable/__init__.py
|
|
109
116
|
uncountable/py.typed
|
|
110
117
|
uncountable/core/__init__.py
|
|
118
|
+
uncountable/core/async_batch.py
|
|
111
119
|
uncountable/core/client.py
|
|
120
|
+
uncountable/core/file_upload.py
|
|
121
|
+
uncountable/core/types.py
|
|
112
122
|
uncountable/integration/__init__.py
|
|
113
123
|
uncountable/integration/construct_client.py
|
|
114
124
|
uncountable/integration/cron.py
|
|
@@ -122,6 +132,7 @@ uncountable/integration/executors/__init__.py
|
|
|
122
132
|
uncountable/integration/executors/script_executor.py
|
|
123
133
|
uncountable/types/__init__.py
|
|
124
134
|
uncountable/types/async_batch.py
|
|
135
|
+
uncountable/types/async_batch_processor.py
|
|
125
136
|
uncountable/types/base.py
|
|
126
137
|
uncountable/types/calculations.py
|
|
127
138
|
uncountable/types/chemical_structure.py
|
|
@@ -136,12 +147,16 @@ uncountable/types/identifier.py
|
|
|
136
147
|
uncountable/types/input_attributes.py
|
|
137
148
|
uncountable/types/inputs.py
|
|
138
149
|
uncountable/types/outputs.py
|
|
150
|
+
uncountable/types/permissions.py
|
|
139
151
|
uncountable/types/phases.py
|
|
152
|
+
uncountable/types/post_base.py
|
|
140
153
|
uncountable/types/recipe_identifiers.py
|
|
154
|
+
uncountable/types/recipe_inputs.py
|
|
141
155
|
uncountable/types/recipe_links.py
|
|
142
156
|
uncountable/types/recipe_metadata.py
|
|
143
157
|
uncountable/types/recipe_output_metadata.py
|
|
144
158
|
uncountable/types/recipe_tags.py
|
|
159
|
+
uncountable/types/recipe_workflow_steps.py
|
|
145
160
|
uncountable/types/response.py
|
|
146
161
|
uncountable/types/units.py
|
|
147
162
|
uncountable/types/users.py
|
|
@@ -159,6 +174,7 @@ uncountable/types/api/entity/get_entities_data.py
|
|
|
159
174
|
uncountable/types/api/entity/list_entities.py
|
|
160
175
|
uncountable/types/api/entity/resolve_entity_ids.py
|
|
161
176
|
uncountable/types/api/entity/set_values.py
|
|
177
|
+
uncountable/types/api/entity/transition_entity_phase.py
|
|
162
178
|
uncountable/types/api/id_source/__init__.py
|
|
163
179
|
uncountable/types/api/id_source/list_id_source.py
|
|
164
180
|
uncountable/types/api/id_source/match_id_source.py
|
|
@@ -174,6 +190,8 @@ uncountable/types/api/outputs/__init__.py
|
|
|
174
190
|
uncountable/types/api/outputs/get_output_data.py
|
|
175
191
|
uncountable/types/api/outputs/get_output_names.py
|
|
176
192
|
uncountable/types/api/outputs/resolve_output_conditions.py
|
|
193
|
+
uncountable/types/api/permissions/__init__.py
|
|
194
|
+
uncountable/types/api/permissions/set_core_permissions.py
|
|
177
195
|
uncountable/types/api/project/__init__.py
|
|
178
196
|
uncountable/types/api/project/get_projects.py
|
|
179
197
|
uncountable/types/api/project/get_projects_data.py
|
|
@@ -186,6 +204,8 @@ uncountable/types/api/recipes/associate_recipe_as_input.py
|
|
|
186
204
|
uncountable/types/api/recipes/associate_recipe_as_lot.py
|
|
187
205
|
uncountable/types/api/recipes/create_recipe.py
|
|
188
206
|
uncountable/types/api/recipes/create_recipes.py
|
|
207
|
+
uncountable/types/api/recipes/disassociate_recipe_as_input.py
|
|
208
|
+
uncountable/types/api/recipes/edit_recipe_inputs.py
|
|
189
209
|
uncountable/types/api/recipes/get_curve.py
|
|
190
210
|
uncountable/types/api/recipes/get_recipe_calculations.py
|
|
191
211
|
uncountable/types/api/recipes/get_recipe_links.py
|
|
@@ -195,5 +215,6 @@ uncountable/types/api/recipes/get_recipes_data.py
|
|
|
195
215
|
uncountable/types/api/recipes/set_recipe_inputs.py
|
|
196
216
|
uncountable/types/api/recipes/set_recipe_metadata.py
|
|
197
217
|
uncountable/types/api/recipes/set_recipe_outputs.py
|
|
218
|
+
uncountable/types/api/recipes/set_recipe_tags.py
|
|
198
219
|
uncountable/types/api/triggers/__init__.py
|
|
199
220
|
uncountable/types/api/triggers/run_trigger.py
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from decimal import Decimal
|
|
2
|
+
from uncountable.core import AuthDetailsApiKey, Client
|
|
3
|
+
from uncountable.core import AsyncBatchProcessor
|
|
4
|
+
from uncountable.types import (
|
|
5
|
+
recipe_metadata,
|
|
6
|
+
)
|
|
7
|
+
from uncountable.types.identifier import IdentifierKeyBatchReference
|
|
8
|
+
from uncountable.types.recipe_identifiers import (
|
|
9
|
+
RecipeIdentifierEditableName,
|
|
10
|
+
RecipeIdentifiers,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
client = Client(
|
|
15
|
+
base_url="https://app.uncountable.com",
|
|
16
|
+
auth_details=AuthDetailsApiKey(
|
|
17
|
+
api_id="X",
|
|
18
|
+
api_secret_key="X",
|
|
19
|
+
),
|
|
20
|
+
)
|
|
21
|
+
batch_loader = AsyncBatchProcessor(client=client)
|
|
22
|
+
recipe_identifiers: RecipeIdentifiers = []
|
|
23
|
+
recipe_identifiers.append(
|
|
24
|
+
RecipeIdentifierEditableName(editable_name="My recipe from API")
|
|
25
|
+
)
|
|
26
|
+
req = batch_loader.create_recipe(
|
|
27
|
+
material_family_id=1, workflow_id=1, identifiers=recipe_identifiers
|
|
28
|
+
)
|
|
29
|
+
created_recipe_reference = req.batch_reference
|
|
30
|
+
batch_loader.set_recipe_metadata(
|
|
31
|
+
recipe_key=IdentifierKeyBatchReference(reference=created_recipe_reference),
|
|
32
|
+
recipe_metadata=[
|
|
33
|
+
recipe_metadata.MetadataValue(metadata_id=7, value_numeric=Decimal(38))
|
|
34
|
+
],
|
|
35
|
+
)
|
|
36
|
+
job_id = batch_loader.send()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pprint import pprint
|
|
3
|
+
|
|
4
|
+
from uncountable import AuthDetailsApiKey, Client, MediaFileUpload
|
|
5
|
+
|
|
6
|
+
client = Client(
|
|
7
|
+
base_url="http://localhost:5000",
|
|
8
|
+
auth_details=AuthDetailsApiKey(
|
|
9
|
+
api_id=os.environ["UNC_API_ID"],
|
|
10
|
+
api_secret_key=os.environ["UNC_API_SECRET_KEY"],
|
|
11
|
+
),
|
|
12
|
+
)
|
|
13
|
+
uploaded = client.upload_files(
|
|
14
|
+
file_uploads=[
|
|
15
|
+
MediaFileUpload(path="/my/file/path.doc"),
|
|
16
|
+
MediaFileUpload(path="/my/file/path2.doc"),
|
|
17
|
+
]
|
|
18
|
+
)
|
|
19
|
+
pprint(uploaded)
|
|
@@ -14,7 +14,7 @@ from pkgs.type_spec import builder
|
|
|
14
14
|
from ...argument_parser import CachedParser
|
|
15
15
|
from ..emit_typescript_util import ts_name
|
|
16
16
|
from ..util import rewrite_file
|
|
17
|
-
from .emit_typescript import emit_action_definitions
|
|
17
|
+
from .emit_typescript import ActionDefinitionWithArgument, emit_action_definitions
|
|
18
18
|
|
|
19
19
|
key_name = "name"
|
|
20
20
|
key_icon = "icon"
|
|
@@ -61,11 +61,11 @@ def get_action_registry_files_info() -> list[ActionRegistryFileInfo]:
|
|
|
61
61
|
|
|
62
62
|
def main() -> None:
|
|
63
63
|
files_info = get_action_registry_files_info()
|
|
64
|
-
action_definitions: defaultdict[str, list[
|
|
64
|
+
action_definitions: defaultdict[str, list[ActionDefinitionWithArgument]] = (
|
|
65
65
|
defaultdict(list)
|
|
66
66
|
)
|
|
67
|
-
all_action_definitions: list[actions_registry_t.
|
|
68
|
-
|
|
67
|
+
all_action_definitions: list[actions_registry_t.ActionDefinitionInternal] = []
|
|
68
|
+
action_definitions_with_arguments_list: list[ActionDefinitionWithArgument] = []
|
|
69
69
|
for file_info in files_info:
|
|
70
70
|
in_action_definitions = action_definition_parser.parse_yaml_file(
|
|
71
71
|
file_info.filepath
|
|
@@ -79,29 +79,41 @@ def main() -> None:
|
|
|
79
79
|
modules.append(file_info.filename)
|
|
80
80
|
|
|
81
81
|
module_str = "_".join(modules)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
action_definition = actions_registry_t.ActionDefinitionInternal(
|
|
83
|
+
name=definition.name,
|
|
84
|
+
short_description=definition.short_description,
|
|
85
|
+
description=definition.description,
|
|
86
|
+
icon=definition.icon,
|
|
87
|
+
ref_name=ref_name,
|
|
88
|
+
module=actions_registry_t.ActionsRegistryModule(
|
|
89
|
+
ts_name(module_str, name_case=builder.NameCase.convert)
|
|
90
|
+
),
|
|
91
|
+
visibility_scope=[
|
|
92
|
+
actions_registry_t.ActionDefinitionVisibilityScope(item)
|
|
93
|
+
for item in definition.visibility_scope
|
|
94
|
+
]
|
|
95
|
+
if definition.visibility_scope is not None
|
|
96
|
+
else None,
|
|
97
|
+
)
|
|
98
|
+
action_definitions_with_arguments_list.append(
|
|
99
|
+
ActionDefinitionWithArgument(
|
|
100
|
+
module=module_str,
|
|
88
101
|
ref_name=ref_name,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
),
|
|
92
|
-
visibility_scope=[
|
|
93
|
-
actions_registry_t.ActionDefinitionVisibilityScope(item)
|
|
94
|
-
for item in definition.visibility_scope
|
|
95
|
-
]
|
|
96
|
-
if definition.visibility_scope is not None
|
|
97
|
-
else None,
|
|
102
|
+
arguments=definition.arguments,
|
|
103
|
+
definition=action_definition,
|
|
98
104
|
)
|
|
99
105
|
)
|
|
100
|
-
|
|
101
|
-
|
|
106
|
+
all_action_definitions.append(action_definition)
|
|
107
|
+
action_definitions_with_arguments_list = sorted(
|
|
108
|
+
action_definitions_with_arguments_list,
|
|
109
|
+
key=lambda item: (item.module, item.ref_name),
|
|
102
110
|
)
|
|
103
|
-
|
|
104
|
-
|
|
111
|
+
|
|
112
|
+
for action_definition_with_argument in action_definitions_with_arguments_list:
|
|
113
|
+
action_definitions[action_definition_with_argument.module].append(
|
|
114
|
+
action_definition_with_argument
|
|
115
|
+
)
|
|
116
|
+
|
|
105
117
|
ts_content = emit_action_definitions(action_definitions)
|
|
106
118
|
rewrite_file(
|
|
107
119
|
"main/site/js/materials/base/actions_registry/action_definitions.tsx",
|
|
@@ -1,17 +1,34 @@
|
|
|
1
1
|
import io
|
|
2
2
|
from collections import defaultdict
|
|
3
|
+
from dataclasses import dataclass
|
|
3
4
|
|
|
4
5
|
from main.base.types import actions_registry_t
|
|
5
6
|
|
|
6
7
|
from ...type_spec import builder
|
|
7
|
-
from ..emit_typescript_util import
|
|
8
|
+
from ..emit_typescript_util import (
|
|
9
|
+
INDENT,
|
|
10
|
+
MODIFY_NOTICE,
|
|
11
|
+
resolve_namespace_ref,
|
|
12
|
+
ts_name,
|
|
13
|
+
ts_type_name,
|
|
14
|
+
)
|
|
8
15
|
from ..util import encode_common_string
|
|
9
16
|
|
|
10
17
|
|
|
11
|
-
def _action_symbol_name(
|
|
18
|
+
def _action_symbol_name(
|
|
19
|
+
action_definition: actions_registry_t.ActionDefinitionInternal,
|
|
20
|
+
) -> str:
|
|
12
21
|
return f"{ts_name(action_definition.ref_name, name_case=builder.NameCase.convert)}"
|
|
13
22
|
|
|
14
23
|
|
|
24
|
+
def _action_type_name(ref_name: str) -> str:
|
|
25
|
+
return f"{ts_type_name(ref_name)}"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _action_namespace_name(name: str) -> str:
|
|
29
|
+
return f"{resolve_namespace_ref(builder.SpecNamespace(name=name))}"
|
|
30
|
+
|
|
31
|
+
|
|
15
32
|
def _action_module_name_base(module: str) -> str:
|
|
16
33
|
return f"{ts_name(module, name_case=builder.NameCase.convert)}"
|
|
17
34
|
|
|
@@ -24,24 +41,54 @@ def _action_module_name(module: str) -> str:
|
|
|
24
41
|
return f"ActionsRegistryT.ActionsRegistryModule.{_action_module_name_base(module)}"
|
|
25
42
|
|
|
26
43
|
|
|
44
|
+
@dataclass(kw_only=True)
|
|
45
|
+
class ActionDefinitionWithArgument:
|
|
46
|
+
module: str
|
|
47
|
+
ref_name: str
|
|
48
|
+
arguments: str | None
|
|
49
|
+
definition: actions_registry_t.ActionDefinitionInternal
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _emit_imports(
|
|
53
|
+
action_definitions: defaultdict[str, list[ActionDefinitionWithArgument]],
|
|
54
|
+
) -> str:
|
|
55
|
+
out = io.StringIO()
|
|
56
|
+
namespaces = set()
|
|
57
|
+
for definitions in action_definitions.values():
|
|
58
|
+
for definition in definitions:
|
|
59
|
+
if definition.arguments is not None:
|
|
60
|
+
argument_parts = definition.arguments.split(".")
|
|
61
|
+
namespace = argument_parts[0]
|
|
62
|
+
namespaces.add(namespace)
|
|
63
|
+
namespaces_to_import = ", ".join(
|
|
64
|
+
sorted([f"type {_action_namespace_name(item)}" for item in list(namespaces)])
|
|
65
|
+
)
|
|
66
|
+
out.write(
|
|
67
|
+
f'import {{ ActionsRegistryT, {namespaces_to_import} }} from "unc_mat/types"\n\n'
|
|
68
|
+
)
|
|
69
|
+
out.write(MODIFY_NOTICE)
|
|
70
|
+
return out.getvalue()
|
|
71
|
+
|
|
72
|
+
|
|
27
73
|
def emit_action_definitions(
|
|
28
|
-
action_definitions: defaultdict[str, list[
|
|
74
|
+
action_definitions: defaultdict[str, list[ActionDefinitionWithArgument]],
|
|
29
75
|
) -> str:
|
|
30
76
|
out = io.StringIO()
|
|
31
77
|
out.write(MODIFY_NOTICE)
|
|
32
78
|
out.write("\n")
|
|
33
|
-
out.write(
|
|
34
|
-
out.write(MODIFY_NOTICE)
|
|
79
|
+
out.write(_emit_imports(action_definitions))
|
|
35
80
|
modules = []
|
|
36
81
|
for key, values in action_definitions.items():
|
|
37
82
|
out.write(MODIFY_NOTICE)
|
|
38
83
|
modules.append(key)
|
|
39
84
|
out.write(f"export const {_action_module_name_obj(key)} = {{\n")
|
|
40
|
-
for
|
|
85
|
+
for item in values:
|
|
41
86
|
out.write(MODIFY_NOTICE)
|
|
42
|
-
out.write(_emit_action_definition(
|
|
87
|
+
out.write(_emit_action_definition(item.definition, item.arguments, INDENT))
|
|
43
88
|
out.write("}\n")
|
|
44
89
|
|
|
90
|
+
out.write(MODIFY_NOTICE)
|
|
91
|
+
out.write("\n")
|
|
45
92
|
out.write(MODIFY_NOTICE)
|
|
46
93
|
out.write("\n")
|
|
47
94
|
out.write("export const actionDefinitions = {\n")
|
|
@@ -58,12 +105,27 @@ def emit_action_definitions(
|
|
|
58
105
|
return out.getvalue()
|
|
59
106
|
|
|
60
107
|
|
|
108
|
+
def _get_argument_type(arguments: str | None) -> str | None:
|
|
109
|
+
if arguments is None:
|
|
110
|
+
return None
|
|
111
|
+
argument_parts = arguments.split(".")
|
|
112
|
+
namespace = argument_parts[0]
|
|
113
|
+
type_name = argument_parts[1]
|
|
114
|
+
if namespace is not None and type_name is not None:
|
|
115
|
+
return f"{_action_namespace_name(namespace)}.{type_name}"
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
|
|
61
119
|
def _emit_action_definition(
|
|
62
|
-
action_definition: actions_registry_t.
|
|
120
|
+
action_definition: actions_registry_t.ActionDefinitionInternal,
|
|
121
|
+
arguments: str | None,
|
|
122
|
+
indent: str,
|
|
63
123
|
) -> str:
|
|
64
124
|
out = io.StringIO()
|
|
65
125
|
|
|
66
126
|
sub_indent = indent + INDENT
|
|
127
|
+
argument_type = _get_argument_type(arguments)
|
|
128
|
+
argument_type = f"<{argument_type}>" if argument_type is not None else ""
|
|
67
129
|
out.write(f"{indent}{_action_symbol_name(action_definition)}: {{\n")
|
|
68
130
|
out.write(f"{sub_indent}name: {encode_common_string(action_definition.name)},\n")
|
|
69
131
|
if action_definition.icon is not None:
|
|
@@ -85,7 +147,7 @@ def _emit_action_definition(
|
|
|
85
147
|
out.write(
|
|
86
148
|
f"{sub_indent}visibilityScope: {_emit_visibility_scope(action_definition.visibility_scope)},\n"
|
|
87
149
|
)
|
|
88
|
-
out.write(f"{indent}}},\n")
|
|
150
|
+
out.write(f"{indent}}} as ActionsRegistryT.ActionDefinition{argument_type},\n")
|
|
89
151
|
return out.getvalue()
|
|
90
152
|
|
|
91
153
|
|
|
@@ -10,7 +10,7 @@ import re
|
|
|
10
10
|
from collections import defaultdict
|
|
11
11
|
from dataclasses import MISSING, dataclass
|
|
12
12
|
from enum import Enum, StrEnum, auto
|
|
13
|
-
from typing import Any, Optional
|
|
13
|
+
from typing import Any, Optional, Self
|
|
14
14
|
|
|
15
15
|
from . import util
|
|
16
16
|
from .util import parse_type_str, unused
|
|
@@ -184,6 +184,34 @@ class SpecTypeInstance(SpecType):
|
|
|
184
184
|
return defn_type + self.parameters
|
|
185
185
|
|
|
186
186
|
|
|
187
|
+
@dataclass(kw_only=True)
|
|
188
|
+
class SpecEndpointExample:
|
|
189
|
+
summary: str
|
|
190
|
+
description: str
|
|
191
|
+
arguments: dict[str, object]
|
|
192
|
+
data: dict[str, object]
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@dataclass(kw_only=True)
|
|
196
|
+
class SpecGuide:
|
|
197
|
+
title: str
|
|
198
|
+
markdown_content: str
|
|
199
|
+
html_content: str
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@dataclass(kw_only=True, frozen=True)
|
|
203
|
+
class RootGuideKey:
|
|
204
|
+
pass
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass(kw_only=True, frozen=True)
|
|
208
|
+
class EndpointGuideKey:
|
|
209
|
+
path: str
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
SpecGuideKey = RootGuideKey | EndpointGuideKey
|
|
213
|
+
|
|
214
|
+
|
|
187
215
|
class SpecTypeLiteralWrapper(SpecType):
|
|
188
216
|
def __init__(
|
|
189
217
|
self,
|
|
@@ -672,6 +700,32 @@ class ResultType(StrEnum):
|
|
|
672
700
|
RE_ENDPOINT_ROOT = re.compile(r"\${([_a-z]+)}")
|
|
673
701
|
|
|
674
702
|
|
|
703
|
+
@dataclass(kw_only=True, frozen=True)
|
|
704
|
+
class _EndpointPathDetails:
|
|
705
|
+
root: str
|
|
706
|
+
root_path: str
|
|
707
|
+
resolved_path: str
|
|
708
|
+
|
|
709
|
+
|
|
710
|
+
def _resolve_endpoint_path(
|
|
711
|
+
path: str, api_endpoints: dict[str, str]
|
|
712
|
+
) -> _EndpointPathDetails:
|
|
713
|
+
root_path_source = path.split("/")[0]
|
|
714
|
+
root_match = RE_ENDPOINT_ROOT.fullmatch(root_path_source)
|
|
715
|
+
if root_match is None:
|
|
716
|
+
raise Exception(f"invalid-api-path-root:{root_path_source}")
|
|
717
|
+
|
|
718
|
+
root_var = root_match.group(1)
|
|
719
|
+
root_path = api_endpoints[root_var]
|
|
720
|
+
|
|
721
|
+
_, *rest_path = path.split("/", 1)
|
|
722
|
+
resolved_path = "/".join([root_path] + rest_path)
|
|
723
|
+
|
|
724
|
+
return _EndpointPathDetails(
|
|
725
|
+
root=root_var, root_path=root_path, resolved_path=resolved_path
|
|
726
|
+
)
|
|
727
|
+
|
|
728
|
+
|
|
675
729
|
class SpecEndpoint:
|
|
676
730
|
method: RouteMethod
|
|
677
731
|
root: str
|
|
@@ -680,9 +734,11 @@ class SpecEndpoint:
|
|
|
680
734
|
path_basename: str
|
|
681
735
|
data_loader: bool
|
|
682
736
|
is_sdk: bool
|
|
737
|
+
is_beta: bool
|
|
683
738
|
# Don't emit TypeScript endpoint code
|
|
684
739
|
suppress_ts: bool
|
|
685
740
|
function: Optional[str]
|
|
741
|
+
async_batch_path: str | None = None
|
|
686
742
|
result_type: ResultType = ResultType.json
|
|
687
743
|
has_attachment: bool = False
|
|
688
744
|
desc: str | None = None
|
|
@@ -701,6 +757,8 @@ class SpecEndpoint:
|
|
|
701
757
|
"path",
|
|
702
758
|
"data_loader",
|
|
703
759
|
"is_sdk",
|
|
760
|
+
"is_beta",
|
|
761
|
+
"async_batch_path",
|
|
704
762
|
"function",
|
|
705
763
|
"suppress_ts",
|
|
706
764
|
"desc",
|
|
@@ -727,6 +785,15 @@ class SpecEndpoint:
|
|
|
727
785
|
assert isinstance(is_sdk, bool)
|
|
728
786
|
self.is_sdk = is_sdk
|
|
729
787
|
|
|
788
|
+
is_beta = data.get("is_beta", False)
|
|
789
|
+
assert isinstance(is_beta, bool)
|
|
790
|
+
self.is_beta = is_beta
|
|
791
|
+
|
|
792
|
+
async_batch_path = data.get("async_batch_path")
|
|
793
|
+
if async_batch_path is not None:
|
|
794
|
+
assert isinstance(async_batch_path, str)
|
|
795
|
+
self.async_batch_path = async_batch_path
|
|
796
|
+
|
|
730
797
|
self.function = data.get("function")
|
|
731
798
|
|
|
732
799
|
suppress_ts = data.get("suppress_ts", False)
|
|
@@ -735,14 +802,10 @@ class SpecEndpoint:
|
|
|
735
802
|
|
|
736
803
|
self.result_type = ResultType(data.get("result_type", ResultType.json.value))
|
|
737
804
|
|
|
805
|
+
path_details = _resolve_endpoint_path(data["path"], builder.api_endpoints)
|
|
806
|
+
self.root = path_details.root
|
|
807
|
+
self.path_root = path_details.root_path
|
|
738
808
|
self.desc = data.get("desc")
|
|
739
|
-
|
|
740
|
-
root_match = RE_ENDPOINT_ROOT.fullmatch(path[0])
|
|
741
|
-
if root_match is None:
|
|
742
|
-
raise Exception(f"invalid-api-path-root:{path[0]}")
|
|
743
|
-
|
|
744
|
-
self.root = root_match.group(1)
|
|
745
|
-
self.path_root = builder.api_endpoints[self.root]
|
|
746
809
|
# IMPROVE: remove need for is_external flag
|
|
747
810
|
self.is_external = self.path_root == "api/external"
|
|
748
811
|
self.has_attachment = data.get("has_attachment", False)
|
|
@@ -751,6 +814,10 @@ class SpecEndpoint:
|
|
|
751
814
|
not is_sdk or self.desc is not None
|
|
752
815
|
), f"Endpoint description required for SDK endpoints, missing: {path}"
|
|
753
816
|
|
|
817
|
+
@property
|
|
818
|
+
def resolved_path(self: Self) -> str:
|
|
819
|
+
return f"{self.path_root}/{self.path_dirname}/{self.path_basename}"
|
|
820
|
+
|
|
754
821
|
|
|
755
822
|
def _parse_const(
|
|
756
823
|
builder: SpecBuilder,
|
|
@@ -1001,6 +1068,8 @@ class SpecBuilder:
|
|
|
1001
1068
|
self.pending: list[NamespaceDataPair] = []
|
|
1002
1069
|
self.parts: dict[str, dict[str, str]] = defaultdict(dict)
|
|
1003
1070
|
self.preparts: dict[str, dict[str, str]] = defaultdict(dict)
|
|
1071
|
+
self.examples: dict[str, list[SpecEndpointExample]] = defaultdict(list)
|
|
1072
|
+
self.guides: dict[SpecGuideKey, list[SpecGuide]] = defaultdict(list)
|
|
1004
1073
|
self.api_endpoints = api_endpoints
|
|
1005
1074
|
base_namespace = SpecNamespace(name=base_namespace_name)
|
|
1006
1075
|
for base_type in BaseTypeName:
|
|
@@ -1185,5 +1254,53 @@ class SpecBuilder:
|
|
|
1185
1254
|
def add_prepart_file(self, target: str, name: str, data: str) -> None:
|
|
1186
1255
|
self.preparts[target][name] = data
|
|
1187
1256
|
|
|
1257
|
+
def add_example_file(self, data: dict[str, object]) -> None:
|
|
1258
|
+
path_details = _resolve_endpoint_path(str(data["path"]), self.api_endpoints)
|
|
1259
|
+
|
|
1260
|
+
examples_data = data["examples"]
|
|
1261
|
+
if not isinstance(examples_data, list):
|
|
1262
|
+
raise Exception(
|
|
1263
|
+
f"'examples' in example files are expected to be a list, endpoint_path={path_details.resolved_path}"
|
|
1264
|
+
)
|
|
1265
|
+
for example in examples_data:
|
|
1266
|
+
arguments = example["arguments"]
|
|
1267
|
+
data_example = example["data"]
|
|
1268
|
+
if not isinstance(arguments, dict) or not isinstance(data_example, dict):
|
|
1269
|
+
raise Exception(
|
|
1270
|
+
f"'arguments' and 'data' fields must be dictionaries for each endpoint example, endpoint={path_details.resolved_path}"
|
|
1271
|
+
)
|
|
1272
|
+
self.examples[path_details.resolved_path].append(
|
|
1273
|
+
SpecEndpointExample(
|
|
1274
|
+
summary=str(example["summary"]),
|
|
1275
|
+
description=str(example["description"]),
|
|
1276
|
+
arguments=arguments,
|
|
1277
|
+
data=data_example,
|
|
1278
|
+
)
|
|
1279
|
+
)
|
|
1280
|
+
|
|
1281
|
+
def add_guide_file(self, file_content: str) -> None:
|
|
1282
|
+
import markdown
|
|
1283
|
+
|
|
1284
|
+
md = markdown.Markdown(extensions=["meta"])
|
|
1285
|
+
html = md.convert(file_content)
|
|
1286
|
+
meta: dict[str, list[str]] = md.Meta # type: ignore[attr-defined]
|
|
1287
|
+
title_meta: list[str] | None = meta.get("title")
|
|
1288
|
+
if title_meta is None:
|
|
1289
|
+
raise Exception("guides requier a title in the meta section")
|
|
1290
|
+
|
|
1291
|
+
path_meta: list[str] | None = meta.get("path")
|
|
1292
|
+
guide_key: SpecGuideKey = RootGuideKey()
|
|
1293
|
+
if path_meta is not None:
|
|
1294
|
+
path_details = _resolve_endpoint_path("".join(path_meta), self.api_endpoints)
|
|
1295
|
+
guide_key = EndpointGuideKey(path=path_details.resolved_path)
|
|
1296
|
+
|
|
1297
|
+
self.guides[guide_key].append(
|
|
1298
|
+
SpecGuide(
|
|
1299
|
+
title="".join(title_meta),
|
|
1300
|
+
html_content=html,
|
|
1301
|
+
markdown_content=file_content,
|
|
1302
|
+
)
|
|
1303
|
+
)
|
|
1304
|
+
|
|
1188
1305
|
def resolve_proper_name(self, stype: SpecTypeDefn) -> str:
|
|
1189
1306
|
return f"{'.'.join(stype.namespace.path)}.{stype.name}"
|
|
@@ -56,6 +56,7 @@ class PythonConfig(BaseLanguageConfig):
|
|
|
56
56
|
emit_api_argument_lookup: bool = (
|
|
57
57
|
False # emit a lookup for api endpoint path to argument type.
|
|
58
58
|
)
|
|
59
|
+
emit_async_batch_processor: bool = False # emit the async batch wrapping functions
|
|
59
60
|
emit_client_class: bool = False # emit the base class for the api client
|
|
60
61
|
all_named_type_exports: bool = False # emit __all__ for all named type exports
|
|
61
62
|
sdk_endpoints_only: bool = False # only emit is_sdk endpoints
|