UncountablePythonSDK 0.0.55__tar.gz → 0.0.56__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.55/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.56}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/UncountablePythonSDK.egg-info/SOURCES.txt +1 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/examples/create_entity.py +3 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/examples/edit_recipe_inputs.py +3 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/argument_parser/argument_parser.py +4 -2
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/_gdrive_session.py +5 -2
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/_s3_session.py +2 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/_sftp_session.py +5 -4
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization/serial_class.py +6 -2
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization/yaml.py +4 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/actions_registry/emit_typescript.py +3 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/builder.py +16 -6
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/config.py +3 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/emit_io_ts.py +5 -5
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/emit_open_api.py +10 -6
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/emit_open_api_util.py +3 -4
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/emit_python.py +9 -5
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/emit_typescript.py +17 -8
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/type_info/emit_type_info.py +5 -3
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/value_spec/convert_type.py +3 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/value_spec/emit_python.py +12 -4
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/core/client.py +3 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/core/file_upload.py +3 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/construct_client.py +2 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/executors/generic_upload_executor.py +9 -7
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/secret_retrieval/retrieve_secret.py +1 -3
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/telemetry.py +12 -4
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/__init__.py +2 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/create_entities.py +1 -1
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/create_entity.py +1 -1
- uncountablepythonsdk-0.0.56/uncountable/types/api/recipes/clear_recipe_outputs.py +35 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/async_batch.py +1 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/async_batch_processor.py +72 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/async_batch_t.py +9 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/client_base.py +22 -2
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/entity_t.py +2 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/.github/workflows/documentation.yml +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/.github/workflows/publish.yml +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/.gitignore +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/README.md +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/UncountablePythonSDK.egg-info/requires.txt +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/.gitignore +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/conf.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/index.md +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/justfile +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/quickstart.md +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/requirements.txt +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/android-chrome-192x192.png +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/android-chrome-512x512.png +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/apple-touch-icon.png +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/browserconfig.xml +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/favicon-16x16.png +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/favicon-32x32.png +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/manifest.json +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/mstile-150x150.png +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/favicons/safari-pinned-tab.svg +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/docs/static/logo_blue.png +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/examples/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/examples/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/examples/upload_files.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/argument_parser/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/argument_parser/_is_enum.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/argument_parser/_is_namedtuple.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/argument_parser/case_convert.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/_local_session.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/file_type_utils.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/filesystem_session.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization/missing_sentry.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization/opaque_key.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization/serial_union.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization_util/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization_util/serialization_helpers.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/strenum_compat/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/strenum_compat/strenum_compat.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/actions_registry/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/actions_registry/__main__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/emit_typescript_util.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/load_types.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/open_api_util.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/parts/base.py.prepart +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/parts/base.ts.prepart +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/test.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/type_info/__main__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/util.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/value_spec/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/value_spec/__main__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/value_spec/types.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pyproject.toml +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/setup.cfg +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/core/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/core/async_batch.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/core/types.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/core/version.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/cron.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/db/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/db/connect.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/entrypoint.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/executors/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/executors/executors.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/executors/script_executor.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/job.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/secret_retrieval/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/integration/server.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/py.typed +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/batch/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/batch/execute_batch.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/chemical/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/get_entities_data.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/list_entities.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/lock_entity.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/set_values.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/entity/unlock_entity.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/equipment/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/field_options/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/id_source/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/id_source/list_id_source.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/id_source/match_id_source.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/input_groups/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/create_inputs.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/get_input_data.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/get_input_names.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/set_input_category.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/material_families/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/outputs/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/outputs/get_output_data.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/outputs/get_output_names.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/permissions/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/project/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/project/get_projects.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/project/get_projects_data.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipe_links/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/archive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/create_recipe.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/create_recipes.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/get_curve.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/lock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/triggers/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/triggers/run_trigger.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/uploader/__init__.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/base.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/base_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/calculations.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/calculations_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/chemical_structure.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/chemical_structure_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/client_config.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/client_config_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/curves.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/curves_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/entity.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/experiment_groups.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/experiment_groups_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/field_values.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/field_values_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/fields.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/fields_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/generic_upload.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/generic_upload_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/id_source.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/id_source_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/identifier.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/identifier_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/input_attributes.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/input_attributes_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/inputs.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/job_definition.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/job_definition_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/outputs.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/outputs_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/overrides.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/overrides_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/permissions.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/permissions_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/phases.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/phases_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/post_base.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/post_base_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_identifiers.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_identifiers_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_inputs.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_inputs_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_links.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_links_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_metadata.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_output_metadata.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_output_metadata_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_tags.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_tags_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_workflow_steps.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipe_workflow_steps_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipes.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/recipes_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/response.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/response_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/secret_retrieval.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/secret_retrieval_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/units.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/units_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/users.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/users_t.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/workflows.py +0 -0
- {uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/uncountable/types/workflows_t.py +0 -0
{uncountablepythonsdk-0.0.55/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.56}/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.56
|
|
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.55 → uncountablepythonsdk-0.0.56/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.56
|
|
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
|
|
@@ -229,6 +229,7 @@ uncountable/types/api/recipes/add_recipe_to_project.py
|
|
|
229
229
|
uncountable/types/api/recipes/archive_recipes.py
|
|
230
230
|
uncountable/types/api/recipes/associate_recipe_as_input.py
|
|
231
231
|
uncountable/types/api/recipes/associate_recipe_as_lot.py
|
|
232
|
+
uncountable/types/api/recipes/clear_recipe_outputs.py
|
|
232
233
|
uncountable/types/api/recipes/create_recipe.py
|
|
233
234
|
uncountable/types/api/recipes/create_recipes.py
|
|
234
235
|
uncountable/types/api/recipes/disassociate_recipe_as_input.py
|
|
@@ -14,7 +14,9 @@ entities = client.create_entity(
|
|
|
14
14
|
definition_id=24,
|
|
15
15
|
entity_type=entity_t.EntityType.LAB_REQUEST,
|
|
16
16
|
field_values=[
|
|
17
|
-
field_values_t.FieldRefNameValue(
|
|
17
|
+
field_values_t.FieldRefNameValue(
|
|
18
|
+
field_ref_name="name", value="SDK Lab Request"
|
|
19
|
+
),
|
|
18
20
|
field_values_t.FieldRefNameValue(field_ref_name="materialFamilyId", value=1),
|
|
19
21
|
],
|
|
20
22
|
)
|
|
@@ -38,7 +38,9 @@ edits.append(
|
|
|
38
38
|
)
|
|
39
39
|
)
|
|
40
40
|
edits.append(
|
|
41
|
-
edit_recipe_inputs_t.RecipeInputEditAddInstructions(
|
|
41
|
+
edit_recipe_inputs_t.RecipeInputEditAddInstructions(
|
|
42
|
+
instructions="Mix for 3 minutes"
|
|
43
|
+
)
|
|
42
44
|
)
|
|
43
45
|
batch_loader.edit_recipe_inputs(
|
|
44
46
|
recipe_key=IdentifierKeyBatchReference(reference=created_recipe_reference),
|
{uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/argument_parser/argument_parser.py
RENAMED
|
@@ -48,7 +48,7 @@ class ParserExtraFieldsError(ParserError):
|
|
|
48
48
|
self.extra_fields = extra_fields
|
|
49
49
|
|
|
50
50
|
def __str__(self) -> str:
|
|
51
|
-
return f"extra fields were provided: {
|
|
51
|
+
return f"extra fields were provided: {", ".join(self.extra_fields)}"
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
def is_optional(field_type: typing.Any) -> bool:
|
|
@@ -250,7 +250,9 @@ def _build_parser_inner(
|
|
|
250
250
|
convert_string_to_snake_case=context.options.convert_to_snake_case,
|
|
251
251
|
)
|
|
252
252
|
v_parser = _build_parser_inner(args[1], context)
|
|
253
|
-
return lambda value: origin(
|
|
253
|
+
return lambda value: origin(
|
|
254
|
+
(k_parser(k), v_parser(v)) for k, v in value.items()
|
|
255
|
+
)
|
|
254
256
|
|
|
255
257
|
if origin == typing.Literal:
|
|
256
258
|
valid_values: set[T] = set(typing.get_args(parsed_type))
|
{uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/_gdrive_session.py
RENAMED
|
@@ -212,7 +212,8 @@ class GDriveSession(FileSystemSession):
|
|
|
212
212
|
for file_context in files:
|
|
213
213
|
if (
|
|
214
214
|
valid_file_extensions is not None
|
|
215
|
-
and os.path.splitext(file_context["name"])[1]
|
|
215
|
+
and os.path.splitext(file_context["name"])[1]
|
|
216
|
+
not in valid_file_extensions
|
|
216
217
|
):
|
|
217
218
|
continue
|
|
218
219
|
gdrive_files.append(
|
|
@@ -256,7 +257,9 @@ class GDriveSession(FileSystemSession):
|
|
|
256
257
|
dest_filename=new_filename,
|
|
257
258
|
)
|
|
258
259
|
else:
|
|
259
|
-
move_gdrive_file(
|
|
260
|
+
move_gdrive_file(
|
|
261
|
+
self.connection, src_file.file_id, dest_file.file_id
|
|
262
|
+
)
|
|
260
263
|
elif isinstance(src_file, FileObjectData):
|
|
261
264
|
if src_file.mime_type is None:
|
|
262
265
|
raise IncompatibleFileReference(
|
{uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/_s3_session.py
RENAMED
|
@@ -64,7 +64,8 @@ class S3Session(FileSystemSession):
|
|
|
64
64
|
if not recursive and (obj.key == prefix or "/" in obj.key[len(prefix) :]):
|
|
65
65
|
continue
|
|
66
66
|
if valid_extensions is None or any(
|
|
67
|
-
obj.key.endswith(valid_extension)
|
|
67
|
+
obj.key.endswith(valid_extension)
|
|
68
|
+
for valid_extension in valid_extensions
|
|
68
69
|
):
|
|
69
70
|
filesystem_references.append(FileSystemFileReference(obj.key))
|
|
70
71
|
|
{uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/filesystem_utils/_sftp_session.py
RENAMED
|
@@ -42,7 +42,8 @@ def list_sftp_files(
|
|
|
42
42
|
|
|
43
43
|
def _add_file(path: str) -> None:
|
|
44
44
|
if (
|
|
45
|
-
valid_extensions is None
|
|
45
|
+
valid_extensions is None
|
|
46
|
+
or os.path.splitext(path)[1] in valid_extensions
|
|
46
47
|
) and (parent_dir_path is None or os.path.dirname(path) == parent_dir_path):
|
|
47
48
|
file_paths.append(path)
|
|
48
49
|
|
|
@@ -106,9 +107,9 @@ class SFTPSession(FileSystemSession):
|
|
|
106
107
|
recursive: bool = True,
|
|
107
108
|
valid_extensions: list[str] | None = None,
|
|
108
109
|
) -> list[FileSystemObject]:
|
|
109
|
-
if not isinstance(
|
|
110
|
-
dir_path
|
|
111
|
-
):
|
|
110
|
+
if not isinstance(
|
|
111
|
+
dir_path, FileSystemFileReference
|
|
112
|
+
) or not self.connection.isdir(dir_path.filepath):
|
|
112
113
|
raise IncompatibleFileReference()
|
|
113
114
|
|
|
114
115
|
return [
|
{uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/serialization/serial_class.py
RENAMED
|
@@ -91,11 +91,15 @@ def _get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | N
|
|
|
91
91
|
if curr_base_class_data is not None:
|
|
92
92
|
if base_class_data is None:
|
|
93
93
|
base_class_data = _SerialClassData()
|
|
94
|
-
base_class_data.unconverted_keys |=
|
|
94
|
+
base_class_data.unconverted_keys |= (
|
|
95
|
+
curr_base_class_data.unconverted_keys
|
|
96
|
+
)
|
|
95
97
|
base_class_data.unconverted_values |= (
|
|
96
98
|
curr_base_class_data.unconverted_values
|
|
97
99
|
)
|
|
98
|
-
base_class_data.to_string_values |=
|
|
100
|
+
base_class_data.to_string_values |= (
|
|
101
|
+
curr_base_class_data.to_string_values
|
|
102
|
+
)
|
|
99
103
|
base_class_data.parse_require |= curr_base_class_data.parse_require
|
|
100
104
|
return base_class_data
|
|
101
105
|
|
|
@@ -45,7 +45,10 @@ def safe_load(src: str | bytes | SupportsRead) -> Any:
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
def safe_dump(
|
|
48
|
-
obj: Any,
|
|
48
|
+
obj: Any,
|
|
49
|
+
sort_keys: bool = False,
|
|
50
|
+
indent: int | None = None,
|
|
51
|
+
width: int | None = None,
|
|
49
52
|
) -> str:
|
|
50
53
|
return yaml.safe_dump(obj, sort_keys=sort_keys, indent=indent, width=width)
|
|
51
54
|
|
|
@@ -129,7 +129,9 @@ def _emit_action_definition(
|
|
|
129
129
|
out.write(f"{indent}{_action_symbol_name(action_definition)}: {{\n")
|
|
130
130
|
out.write(f"{sub_indent}name: {encode_common_string(action_definition.name)},\n")
|
|
131
131
|
if action_definition.icon is not None:
|
|
132
|
-
out.write(
|
|
132
|
+
out.write(
|
|
133
|
+
f"{sub_indent}icon: {encode_common_string(action_definition.icon)},\n"
|
|
134
|
+
)
|
|
133
135
|
out.write(
|
|
134
136
|
f"{sub_indent}shortDescription: {encode_common_string(action_definition.short_description)},\n"
|
|
135
137
|
)
|
|
@@ -712,7 +712,9 @@ class SpecTypeDefnStringEnum(SpecTypeDefn):
|
|
|
712
712
|
elif isinstance(data_values, list):
|
|
713
713
|
for value in data_values:
|
|
714
714
|
if value in self.values:
|
|
715
|
-
raise Exception(
|
|
715
|
+
raise Exception(
|
|
716
|
+
"duplicate value in typespec enum", self.name, value
|
|
717
|
+
)
|
|
716
718
|
self.values[value] = StringEnumEntry(name=value, value=value)
|
|
717
719
|
else:
|
|
718
720
|
raise Exception("unsupported values type")
|
|
@@ -972,7 +974,9 @@ def _parse_const(
|
|
|
972
974
|
return value
|
|
973
975
|
|
|
974
976
|
if const_type.name == BaseTypeName.s_boolean:
|
|
975
|
-
builder.ensure(
|
|
977
|
+
builder.ensure(
|
|
978
|
+
isinstance(value, bool), "invalid value for boolean constant"
|
|
979
|
+
)
|
|
976
980
|
return value
|
|
977
981
|
|
|
978
982
|
raise Exception("unsupported-const-scalar-type", const_type)
|
|
@@ -1004,7 +1008,9 @@ class SpecConstant:
|
|
|
1004
1008
|
assert isinstance(self.value, dict)
|
|
1005
1009
|
# the parsing checks that the values are correct, so a simple length check
|
|
1006
1010
|
# should be enough to check completeness
|
|
1007
|
-
builder.ensure(
|
|
1011
|
+
builder.ensure(
|
|
1012
|
+
len(key_type.values) == len(self.value), "incomplete-enum-map"
|
|
1013
|
+
)
|
|
1008
1014
|
|
|
1009
1015
|
|
|
1010
1016
|
class SpecNamespace:
|
|
@@ -1335,7 +1341,9 @@ class SpecBuilder:
|
|
|
1335
1341
|
) -> SpecType:
|
|
1336
1342
|
self.push_where(spec)
|
|
1337
1343
|
parsed_type = util.parse_type_str(spec)
|
|
1338
|
-
result = self._convert_parsed_type(
|
|
1344
|
+
result = self._convert_parsed_type(
|
|
1345
|
+
parsed_type, namespace, top=True, scope=scope
|
|
1346
|
+
)
|
|
1339
1347
|
self.pop_where()
|
|
1340
1348
|
return result
|
|
1341
1349
|
|
|
@@ -1385,7 +1393,9 @@ class SpecBuilder:
|
|
|
1385
1393
|
path_meta: list[str] | None = meta.get("path")
|
|
1386
1394
|
guide_key: SpecGuideKey = RootGuideKey()
|
|
1387
1395
|
if path_meta is not None:
|
|
1388
|
-
path_details = _resolve_endpoint_path(
|
|
1396
|
+
path_details = _resolve_endpoint_path(
|
|
1397
|
+
"".join(path_meta), self.api_endpoints
|
|
1398
|
+
)
|
|
1389
1399
|
guide_key = EndpointGuideKey(path=path_details.resolved_path)
|
|
1390
1400
|
|
|
1391
1401
|
self.guides[guide_key].append(
|
|
@@ -1398,4 +1408,4 @@ class SpecBuilder:
|
|
|
1398
1408
|
)
|
|
1399
1409
|
|
|
1400
1410
|
def resolve_proper_name(self, stype: SpecTypeDefn) -> str:
|
|
1401
|
-
return f"{
|
|
1411
|
+
return f"{".".join(stype.namespace.path)}.{stype.name}"
|
|
@@ -125,7 +125,9 @@ def parse_yaml_config(config_file: str) -> Config:
|
|
|
125
125
|
python = _parse_language(PythonConfig, raw_config["python"])
|
|
126
126
|
raw_open_api = raw_config.get("open_api")
|
|
127
127
|
open_api = (
|
|
128
|
-
_parse_language(OpenAPIConfig, raw_open_api)
|
|
128
|
+
_parse_language(OpenAPIConfig, raw_open_api)
|
|
129
|
+
if raw_open_api is not None
|
|
130
|
+
else None
|
|
129
131
|
)
|
|
130
132
|
|
|
131
133
|
return Config(
|
|
@@ -100,14 +100,14 @@ def _emit_type_io_ts_impl(ctx: EmitTypescriptContext, stype: builder.SpecType) -
|
|
|
100
100
|
else:
|
|
101
101
|
assert len(missable_lines) > 0 and len(required_lines) > 0
|
|
102
102
|
ctx.out.write("IO.intersection([\n")
|
|
103
|
-
ctx.out.write(f"{INDENT}IO.partial({
|
|
103
|
+
ctx.out.write(f"{INDENT}IO.partial({"{"}\n")
|
|
104
104
|
for line in missable_lines:
|
|
105
105
|
ctx.out.write(f"{INDENT}{line}")
|
|
106
|
-
ctx.out.write(f"{INDENT}{
|
|
107
|
-
ctx.out.write(f"{INDENT}IO.type({
|
|
106
|
+
ctx.out.write(f"{INDENT}{"}"}),\n")
|
|
107
|
+
ctx.out.write(f"{INDENT}IO.type({"{"}\n")
|
|
108
108
|
for line in required_lines:
|
|
109
109
|
ctx.out.write(f"{INDENT}{line}")
|
|
110
|
-
ctx.out.write(f"{INDENT}{
|
|
110
|
+
ctx.out.write(f"{INDENT}{"}"}),\n")
|
|
111
111
|
ctx.out.write("])\n")
|
|
112
112
|
|
|
113
113
|
ctx.out.write("\n")
|
|
@@ -129,7 +129,7 @@ def refer_to_io_ts(
|
|
|
129
129
|
if stype.defn_type.name == builder.BaseTypeName.s_optional:
|
|
130
130
|
return f"IO.optional({refer_to_io_ts(ctx, stype.parameters[0])})"
|
|
131
131
|
if stype.defn_type.name == builder.BaseTypeName.s_tuple:
|
|
132
|
-
return f"IO.tuple([{
|
|
132
|
+
return f"IO.tuple([{", ".join([refer_to_io_ts(ctx, p) for p in stype.parameters])}])"
|
|
133
133
|
return refer_to_io_ts(ctx, stype.defn_type)
|
|
134
134
|
|
|
135
135
|
assert isinstance(stype, builder.SpecTypeDefn)
|
|
@@ -286,7 +286,9 @@ def _emit_endpoint_request_body(
|
|
|
286
286
|
"type": "object",
|
|
287
287
|
"title": "Body",
|
|
288
288
|
"required": ["data"],
|
|
289
|
-
"properties": {
|
|
289
|
+
"properties": {
|
|
290
|
+
"data": {"$ref": "#/components/schema/Arguments"}
|
|
291
|
+
},
|
|
290
292
|
}
|
|
291
293
|
}
|
|
292
294
|
| _emit_endpoint_argument_examples(examples)
|
|
@@ -361,7 +363,9 @@ def _emit_namespace(
|
|
|
361
363
|
| _emit_is_beta(endpoint.is_beta)
|
|
362
364
|
| _emit_stability_level(endpoint.stability_level)
|
|
363
365
|
| _emit_endpoint_parameters(endpoint, argument_type, ctx.endpoint.examples)
|
|
364
|
-
| _emit_endpoint_request_body(
|
|
366
|
+
| _emit_endpoint_request_body(
|
|
367
|
+
endpoint, argument_type, ctx.endpoint.examples
|
|
368
|
+
)
|
|
365
369
|
| {
|
|
366
370
|
"responses": {
|
|
367
371
|
"200": {
|
|
@@ -412,7 +416,7 @@ def _emit_namespace(
|
|
|
412
416
|
{name: value.asdict() for name, value in types.items()},
|
|
413
417
|
)
|
|
414
418
|
|
|
415
|
-
path = f"{config.types_output}/common/{
|
|
419
|
+
path = f"{config.types_output}/common/{"/".join(namespace.path)}.yaml"
|
|
416
420
|
oa_namespace = {"components": oa_components}
|
|
417
421
|
_rewrite_with_notice(path, yaml.dumps(oa_namespace, sort_keys=False))
|
|
418
422
|
|
|
@@ -555,7 +559,7 @@ def _emit_endpoint(
|
|
|
555
559
|
gctx.tags.add(EmitOpenAPITag(name=tag_name, description=""))
|
|
556
560
|
gctx.tag_groups[tag_group].add(tag_name)
|
|
557
561
|
|
|
558
|
-
ref_path = f"common/{
|
|
562
|
+
ref_path = f"common/{"/".join(namespace.path)}.yaml#/components/endpoint"
|
|
559
563
|
ep = namespace.endpoint
|
|
560
564
|
gctx.paths.append(
|
|
561
565
|
EmitOpenAPIPath(
|
|
@@ -573,7 +577,7 @@ def _emit_endpoint(
|
|
|
573
577
|
ctx.endpoint = EmitOpenAPIEndpoint(
|
|
574
578
|
method=namespace.endpoint.method.lower(),
|
|
575
579
|
tags=[tag_name],
|
|
576
|
-
summary=f"{
|
|
580
|
+
summary=f"{"/".join(namespace.path[path_cutoff:])}",
|
|
577
581
|
description=description,
|
|
578
582
|
is_beta=namespace.endpoint.is_beta,
|
|
579
583
|
stability_level=namespace.endpoint.stability_level,
|
|
@@ -690,5 +694,5 @@ def open_api_type(
|
|
|
690
694
|
ctx.namespaces.add(stype.namespace)
|
|
691
695
|
# external namespace resolution
|
|
692
696
|
return OpenAPIRefType(
|
|
693
|
-
source=f"{resolve_namespace_ref(source_path=ctx.namespace.path, ref_path=stype.namespace.path, ref=
|
|
697
|
+
source=f"{resolve_namespace_ref(source_path=ctx.namespace.path, ref_path=stype.namespace.path, ref="/components/schema")}/{stype.name}"
|
|
694
698
|
)
|
{uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/emit_open_api_util.py
RENAMED
|
@@ -6,7 +6,6 @@ WORK-IN-PROGRESS, DON'T USE!
|
|
|
6
6
|
|
|
7
7
|
from collections import defaultdict
|
|
8
8
|
from dataclasses import dataclass, field
|
|
9
|
-
from typing import TypeAlias
|
|
10
9
|
|
|
11
10
|
from pkgs.serialization_util.serialization_helpers import JsonValue
|
|
12
11
|
|
|
@@ -15,9 +14,9 @@ from .open_api_util import OpenAPIType
|
|
|
15
14
|
|
|
16
15
|
MODIFY_NOTICE = "# DO NOT MODIFY -- This file is generated by type_spec"
|
|
17
16
|
|
|
18
|
-
GlobalContextInfo
|
|
19
|
-
TagGroupToNamedTags
|
|
20
|
-
TagPathsToRef
|
|
17
|
+
type GlobalContextInfo = dict[str, str | dict[str, str]]
|
|
18
|
+
type TagGroupToNamedTags = dict[str, str | list[str]]
|
|
19
|
+
type TagPathsToRef = dict[str, dict[str, str]]
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
@dataclass
|
|
@@ -296,7 +296,7 @@ def _emit_types(*, builder: builder.SpecBuilder, config: PythonConfig) -> None:
|
|
|
296
296
|
full.write(f"# === END section from {namespace.name}.part.py ===\n")
|
|
297
297
|
|
|
298
298
|
basename = "/".join(namespace.path)
|
|
299
|
-
filename = f"{config.types_output}/{basename}{
|
|
299
|
+
filename = f"{config.types_output}/{basename}{"" if len(namespace.path) > 1 else "_t"}.py"
|
|
300
300
|
util.rewrite_file(filename, full.getvalue())
|
|
301
301
|
|
|
302
302
|
# Deprecated SDK support
|
|
@@ -621,7 +621,9 @@ def _emit_string_enum(ctx: Context, stype: builder.SpecTypeDefnStringEnum) -> No
|
|
|
621
621
|
ctx.out.write(f"{INDENT}labels={{\n")
|
|
622
622
|
for entry in stype.values.values():
|
|
623
623
|
if entry.label is not None:
|
|
624
|
-
ctx.out.write(
|
|
624
|
+
ctx.out.write(
|
|
625
|
+
f'{INDENT}{INDENT}"{entry.value}": "{entry.label}",\n'
|
|
626
|
+
)
|
|
625
627
|
|
|
626
628
|
ctx.out.write(f"{INDENT}}},\n")
|
|
627
629
|
if need_deprecated:
|
|
@@ -722,7 +724,9 @@ def _emit_properties(
|
|
|
722
724
|
if (
|
|
723
725
|
isinstance(prop.spec_type, builder.SpecTypeInstance)
|
|
724
726
|
and (
|
|
725
|
-
prop.spec_type.defn_type.is_base_type(
|
|
727
|
+
prop.spec_type.defn_type.is_base_type(
|
|
728
|
+
builder.BaseTypeName.s_list
|
|
729
|
+
)
|
|
726
730
|
)
|
|
727
731
|
and default == "[]"
|
|
728
732
|
):
|
|
@@ -1026,7 +1030,7 @@ def _emit_namespace_imports(
|
|
|
1026
1030
|
if ns.endpoint is not None:
|
|
1027
1031
|
import_alias = "_".join(ns.path[2:]) + "_t"
|
|
1028
1032
|
out.write(
|
|
1029
|
-
f"import {config.types_package}.{
|
|
1033
|
+
f"import {config.types_package}.{".".join(ns.path)} as {import_alias}\n"
|
|
1030
1034
|
)
|
|
1031
1035
|
continue
|
|
1032
1036
|
elif from_namespace is not None:
|
|
@@ -1184,7 +1188,7 @@ def _emit_api_argument_lookup(
|
|
|
1184
1188
|
continue
|
|
1185
1189
|
|
|
1186
1190
|
import_alias = "_".join(namespace.path[1:])
|
|
1187
|
-
api_import = f"{config.types_package}.{
|
|
1191
|
+
api_import = f"{config.types_package}.{".".join(namespace.path)}"
|
|
1188
1192
|
imports.append(f"import {api_import} as {import_alias}")
|
|
1189
1193
|
|
|
1190
1194
|
route_group = (
|
{uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/emit_typescript.py
RENAMED
|
@@ -92,7 +92,9 @@ def _emit_types(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
|
|
|
92
92
|
builder.namespaces.values(),
|
|
93
93
|
key=lambda ns: _resolve_namespace_name(ns),
|
|
94
94
|
):
|
|
95
|
-
ctx = EmitTypescriptContext(
|
|
95
|
+
ctx = EmitTypescriptContext(
|
|
96
|
+
out=io.StringIO(), namespace=namespace, config=config
|
|
97
|
+
)
|
|
96
98
|
|
|
97
99
|
_emit_namespace(ctx, namespace)
|
|
98
100
|
|
|
@@ -109,7 +111,7 @@ def _emit_types(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
|
|
|
109
111
|
# Try to capture some common incompleteness errors
|
|
110
112
|
if namespace.endpoint is None or namespace.endpoint.function is None:
|
|
111
113
|
raise Exception(
|
|
112
|
-
f"Namespace {
|
|
114
|
+
f"Namespace {"/".join(namespace.path)} is incomplete. It should have an endpoint with function, types, and/or constants"
|
|
113
115
|
)
|
|
114
116
|
continue
|
|
115
117
|
|
|
@@ -161,7 +163,9 @@ def _emit_types(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
|
|
|
161
163
|
util.rewrite_file(f"{config.types_output}/index.ts", index_out.getvalue())
|
|
162
164
|
|
|
163
165
|
|
|
164
|
-
def _emit_namespace(
|
|
166
|
+
def _emit_namespace(
|
|
167
|
+
ctx: EmitTypescriptContext, namespace: builder.SpecNamespace
|
|
168
|
+
) -> None:
|
|
165
169
|
for stype in namespace.types.values():
|
|
166
170
|
if namespace.emit_io_ts:
|
|
167
171
|
emit_type_io_ts(ctx, stype, namespace.derive_types_from_io_ts)
|
|
@@ -222,7 +226,7 @@ def _emit_endpoint(
|
|
|
222
226
|
wrap_call = (
|
|
223
227
|
f"{wrap_name}<Arguments>" if is_binary else f"{wrap_name}<Arguments, Response>"
|
|
224
228
|
)
|
|
225
|
-
type_path = f"unc_mat/types/{
|
|
229
|
+
type_path = f"unc_mat/types/{"/".join(namespace.path)}"
|
|
226
230
|
|
|
227
231
|
if is_binary:
|
|
228
232
|
tsx_response_part = f"""import {{ {wrap_name} }} from "unc_base/api"
|
|
@@ -261,12 +265,14 @@ export const apiCall = {wrap_call}(
|
|
|
261
265
|
)
|
|
262
266
|
{data_loader_body}"""
|
|
263
267
|
|
|
264
|
-
output = f"{ctx.config.routes_output}/{
|
|
268
|
+
output = f"{ctx.config.routes_output}/{"/".join(namespace.path)}.tsx"
|
|
265
269
|
util.rewrite_file(output, tsx_api)
|
|
266
270
|
|
|
267
271
|
# Hacky index support, until enough is migrated to regen entirely
|
|
268
272
|
# Emits the import into the UI API index file
|
|
269
|
-
index_path =
|
|
273
|
+
index_path = (
|
|
274
|
+
f"{ctx.config.routes_output}/{"/".join(namespace.path[0:-1])}/index.tsx"
|
|
275
|
+
)
|
|
270
276
|
api_name = f"Api{ts_type_name(namespace.path[0 - 1])}"
|
|
271
277
|
if os.path.exists(index_path):
|
|
272
278
|
with open(index_path) as index:
|
|
@@ -404,7 +410,10 @@ def refer_to_impl(
|
|
|
404
410
|
spec, multi = refer_to_impl(ctx, stype.parameters[0])
|
|
405
411
|
return f"readonly ({spec})[]" if multi else f"readonly {spec}[]", False
|
|
406
412
|
if stype.defn_type.name == builder.BaseTypeName.s_union:
|
|
407
|
-
return
|
|
413
|
+
return (
|
|
414
|
+
f'({" | ".join([refer_to(ctx, p) for p in stype.parameters])})',
|
|
415
|
+
False,
|
|
416
|
+
)
|
|
408
417
|
if stype.defn_type.name == builder.BaseTypeName.s_literal:
|
|
409
418
|
parts = []
|
|
410
419
|
for parameter in stype.parameters:
|
|
@@ -414,7 +423,7 @@ def refer_to_impl(
|
|
|
414
423
|
if stype.defn_type.name == builder.BaseTypeName.s_optional:
|
|
415
424
|
return f"{refer_to(ctx, stype.parameters[0])} | null", True
|
|
416
425
|
if stype.defn_type.name == builder.BaseTypeName.s_tuple:
|
|
417
|
-
return f"[{
|
|
426
|
+
return f"[{", ".join([refer_to(ctx, p) for p in stype.parameters])}]", False
|
|
418
427
|
params = ", ".join([refer_to(ctx, p) for p in stype.parameters])
|
|
419
428
|
return f"{refer_to(ctx, stype.defn_type)}<{params}>", False
|
|
420
429
|
|
|
@@ -3,7 +3,7 @@ import dataclasses
|
|
|
3
3
|
import decimal
|
|
4
4
|
import io
|
|
5
5
|
import json
|
|
6
|
-
from typing import Any, Optional,
|
|
6
|
+
from typing import Any, Optional, Union, cast
|
|
7
7
|
|
|
8
8
|
from main.base.types import data_t
|
|
9
9
|
from main.base.types.base_t import PureJsonValue
|
|
@@ -134,7 +134,7 @@ class MapStringEnum(MapTypeBase):
|
|
|
134
134
|
values: dict[str, str]
|
|
135
135
|
|
|
136
136
|
|
|
137
|
-
MapType
|
|
137
|
+
type MapType = Union[MapTypeObject, MapTypeAlias, MapStringEnum]
|
|
138
138
|
|
|
139
139
|
|
|
140
140
|
@dataclasses.dataclass
|
|
@@ -255,7 +255,9 @@ def _extract_and_validate_layout(
|
|
|
255
255
|
assert group_ref_name in layout, f"missing-base-group:{group_ref_name}"
|
|
256
256
|
|
|
257
257
|
for prop_ref_name in stype.properties:
|
|
258
|
-
assert
|
|
258
|
+
assert (
|
|
259
|
+
prop_ref_name in all_fields_group
|
|
260
|
+
), f"layout-missing-field:{prop_ref_name}"
|
|
259
261
|
|
|
260
262
|
return layout
|
|
261
263
|
|
|
@@ -25,7 +25,9 @@ TYPE_MAP = {
|
|
|
25
25
|
"List": MappedType(base_type=value_spec_t.BaseType.LIST, param_count=1),
|
|
26
26
|
"Optional": MappedType(base_type=value_spec_t.BaseType.OPTIONAL, param_count=1),
|
|
27
27
|
"String": MappedType(base_type=value_spec_t.BaseType.STRING),
|
|
28
|
-
"Union": MappedType(
|
|
28
|
+
"Union": MappedType(
|
|
29
|
+
base_type=value_spec_t.BaseType.UNION, variable_param_count=True
|
|
30
|
+
),
|
|
29
31
|
# not part of type_spec's types now
|
|
30
32
|
"Symbol": MappedType(base_type=value_spec_t.BaseType.SYMBOL),
|
|
31
33
|
"Any": MappedType(base_type=value_spec_t.BaseType.ANY),
|
{uncountablepythonsdk-0.0.55 → uncountablepythonsdk-0.0.56}/pkgs/type_spec/value_spec/emit_python.py
RENAMED
|
@@ -160,7 +160,9 @@ def _emit_function(function: value_spec_t.Function, indent: str) -> str:
|
|
|
160
160
|
sub_indent = indent + INDENT
|
|
161
161
|
out.write(f"{_function_symbol_name(function)} = value_spec_t.Function(\n")
|
|
162
162
|
out.write(f"{sub_indent}name={encode_common_string(function.name)},\n")
|
|
163
|
-
out.write(
|
|
163
|
+
out.write(
|
|
164
|
+
f"{sub_indent}description={encode_common_string(function.description)},\n"
|
|
165
|
+
)
|
|
164
166
|
out.write(f"{sub_indent}brief={encode_common_string(function.brief)},\n")
|
|
165
167
|
out.write(
|
|
166
168
|
f"{sub_indent}return_value={_emit_function_return(function.return_value, sub_indent)},\n"
|
|
@@ -184,16 +186,22 @@ def _emit_argument(argument: value_spec_t.FunctionArgument, indent: str) -> str:
|
|
|
184
186
|
out.write("value_spec_t.FunctionArgument(\n")
|
|
185
187
|
out.write(f"{sub_indent}ref_name={encode_common_string(argument.ref_name)},\n")
|
|
186
188
|
out.write(f"{sub_indent}name={encode_common_string(argument.name)},\n")
|
|
187
|
-
out.write(
|
|
189
|
+
out.write(
|
|
190
|
+
f"{sub_indent}description={encode_common_string(argument.description)},\n"
|
|
191
|
+
)
|
|
188
192
|
out.write(f"{sub_indent}pass_null={str(argument.pass_null)},\n")
|
|
189
|
-
out.write(
|
|
193
|
+
out.write(
|
|
194
|
+
f"{sub_indent}extant=value_spec_t.ArgumentExtant.{argument.extant.name},\n"
|
|
195
|
+
)
|
|
190
196
|
out.write(f"{sub_indent}type={_emit_type(argument.type, sub_indent)},\n")
|
|
191
197
|
out.write(f"{indent})")
|
|
192
198
|
|
|
193
199
|
return out.getvalue()
|
|
194
200
|
|
|
195
201
|
|
|
196
|
-
def _emit_function_return(
|
|
202
|
+
def _emit_function_return(
|
|
203
|
+
return_value: value_spec_t.FunctionReturn, indent: str
|
|
204
|
+
) -> str:
|
|
197
205
|
out = io.StringIO()
|
|
198
206
|
|
|
199
207
|
sub_indent = indent + INDENT
|
|
@@ -56,7 +56,9 @@ HTTPRequest = HTTPPostRequest | HTTPGetRequest
|
|
|
56
56
|
|
|
57
57
|
@dataclass(kw_only=True)
|
|
58
58
|
class ClientConfig(ClientConfigOptions):
|
|
59
|
-
transform_request: typing.Callable[[requests.Request], requests.Request] | None =
|
|
59
|
+
transform_request: typing.Callable[[requests.Request], requests.Request] | None = (
|
|
60
|
+
None
|
|
61
|
+
)
|
|
60
62
|
job_logger: typing.Optional[JobLogger] = None
|
|
61
63
|
|
|
62
64
|
|
|
@@ -100,7 +100,9 @@ class FileUploader:
|
|
|
100
100
|
name=file_bytes.name, file_id=int(location.path.split("/")[-1])
|
|
101
101
|
)
|
|
102
102
|
|
|
103
|
-
def upload_files(
|
|
103
|
+
def upload_files(
|
|
104
|
+
self: Self, *, file_uploads: list[FileUpload]
|
|
105
|
+
) -> list[UploadedFile]:
|
|
104
106
|
return [
|
|
105
107
|
asyncio.run(self._upload_file(file_upload)) for file_upload in file_uploads
|
|
106
108
|
]
|
|
@@ -23,7 +23,8 @@ def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
|
|
|
23
23
|
profile_meta.auth_retrieval.api_id_secret, profile_metadata=profile_meta
|
|
24
24
|
)
|
|
25
25
|
api_key = retrieve_secret(
|
|
26
|
-
profile_meta.auth_retrieval.api_key_secret,
|
|
26
|
+
profile_meta.auth_retrieval.api_key_secret,
|
|
27
|
+
profile_metadata=profile_meta,
|
|
27
28
|
)
|
|
28
29
|
|
|
29
30
|
return AuthDetailsApiKey(api_id=api_id, api_secret_key=api_key)
|
|
@@ -68,7 +68,8 @@ def _filter_by_file_extension(
|
|
|
68
68
|
file
|
|
69
69
|
for file in files
|
|
70
70
|
if file.filename is not None
|
|
71
|
-
and os.path.splitext(file.filename)[-1]
|
|
71
|
+
and os.path.splitext(file.filename)[-1]
|
|
72
|
+
in remote_directory.valid_file_extensions
|
|
72
73
|
]
|
|
73
74
|
|
|
74
75
|
|
|
@@ -102,7 +103,7 @@ def _pull_remote_directory_data(
|
|
|
102
103
|
files_to_pull = _filter_by_max_files(remote_directory, files_to_pull)
|
|
103
104
|
|
|
104
105
|
logger.log_info(
|
|
105
|
-
f"Accessing SFTP directory: {remote_directory.src_path} and pulling files: {
|
|
106
|
+
f"Accessing SFTP directory: {remote_directory.src_path} and pulling files: {", ".join([f.filename for f in files_to_pull if f.filename is not None])}",
|
|
106
107
|
)
|
|
107
108
|
return filesystem_session.download_files(files_to_pull)
|
|
108
109
|
|
|
@@ -210,9 +211,7 @@ class GenericUploadJob(Job):
|
|
|
210
211
|
assert (
|
|
211
212
|
self.data_source.region_name is not None
|
|
212
213
|
), "region_name must be specified for cloud_provider OVH"
|
|
213
|
-
endpoint_url =
|
|
214
|
-
f"https://s3.{self.data_source.region_name}.cloud.ovh.net"
|
|
215
|
-
)
|
|
214
|
+
endpoint_url = f"https://s3.{self.data_source.region_name}.cloud.ovh.net"
|
|
216
215
|
else:
|
|
217
216
|
endpoint_url = self.data_source.endpoint_url
|
|
218
217
|
|
|
@@ -248,7 +247,8 @@ class GenericUploadJob(Job):
|
|
|
248
247
|
for file_data in filtered_file_data:
|
|
249
248
|
files_to_upload.append(
|
|
250
249
|
DataFileUpload(
|
|
251
|
-
data=io.BytesIO(file_data.file_data),
|
|
250
|
+
data=io.BytesIO(file_data.file_data),
|
|
251
|
+
name=file_data.filename,
|
|
252
252
|
)
|
|
253
253
|
)
|
|
254
254
|
if not self.upload_strategy.skip_moving_files:
|
|
@@ -256,7 +256,9 @@ class GenericUploadJob(Job):
|
|
|
256
256
|
filesystem_session=filesystem_session,
|
|
257
257
|
remote_directory_scope=remote_directory,
|
|
258
258
|
success_file_paths=[
|
|
259
|
-
file.filepath
|
|
259
|
+
file.filepath
|
|
260
|
+
if file.filepath is not None
|
|
261
|
+
else file.filename
|
|
260
262
|
for file in filtered_file_data
|
|
261
263
|
],
|
|
262
264
|
# IMPROVE: use triggers/webhooks to mark failed files as failed
|