UncountablePythonSDK 0.0.24__py3-none-any.whl → 0.0.131__py3-none-any.whl
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.
- docs/conf.py +60 -8
- docs/index.md +107 -4
- docs/integration_examples/create_ingredient.md +43 -0
- docs/integration_examples/create_output.md +56 -0
- docs/integration_examples/index.md +6 -0
- docs/justfile +2 -2
- docs/requirements.txt +7 -5
- examples/async_batch.py +5 -6
- examples/basic_auth.py +7 -0
- examples/create_entity.py +4 -6
- examples/create_ingredient_sdk.py +34 -0
- examples/download_files.py +26 -0
- examples/edit_recipe_inputs.py +50 -0
- examples/integration-server/jobs/materials_auto/concurrent_cron.py +11 -0
- examples/integration-server/jobs/materials_auto/example_cron.py +21 -0
- examples/integration-server/jobs/materials_auto/example_http.py +47 -0
- examples/integration-server/jobs/materials_auto/example_instrument.py +100 -0
- examples/integration-server/jobs/materials_auto/example_parse.py +140 -0
- examples/integration-server/jobs/materials_auto/example_predictions.py +61 -0
- examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +39 -0
- examples/integration-server/jobs/materials_auto/example_wh.py +23 -0
- examples/integration-server/jobs/materials_auto/profile.yaml +104 -0
- examples/integration-server/pyproject.toml +224 -0
- examples/invoke_uploader.py +26 -0
- examples/oauth.py +7 -0
- examples/set_recipe_metadata_file.py +40 -0
- examples/set_recipe_output_file_sdk.py +26 -0
- examples/upload_files.py +2 -3
- pkgs/argument_parser/__init__.py +9 -0
- pkgs/argument_parser/_is_namedtuple.py +3 -0
- pkgs/argument_parser/argument_parser.py +295 -74
- pkgs/argument_parser/case_convert.py +4 -3
- pkgs/filesystem_utils/__init__.py +20 -0
- pkgs/filesystem_utils/_blob_session.py +144 -0
- pkgs/filesystem_utils/_gdrive_session.py +309 -0
- pkgs/filesystem_utils/_local_session.py +69 -0
- pkgs/filesystem_utils/_s3_session.py +118 -0
- pkgs/filesystem_utils/_sftp_session.py +151 -0
- pkgs/filesystem_utils/file_type_utils.py +91 -0
- pkgs/filesystem_utils/filesystem_session.py +39 -0
- pkgs/py.typed +0 -0
- pkgs/serialization/__init__.py +8 -1
- pkgs/serialization/annotation.py +64 -0
- pkgs/serialization/missing_sentry.py +1 -1
- pkgs/serialization/opaque_key.py +1 -1
- pkgs/serialization/serial_alias.py +47 -0
- pkgs/serialization/serial_class.py +69 -54
- pkgs/serialization/serial_generic.py +16 -0
- pkgs/serialization/serial_union.py +84 -0
- pkgs/serialization/yaml.py +57 -0
- pkgs/serialization_util/__init__.py +7 -7
- pkgs/serialization_util/convert_to_snakecase.py +27 -0
- pkgs/serialization_util/dataclasses.py +14 -0
- pkgs/serialization_util/serialization_helpers.py +117 -71
- pkgs/type_spec/actions_registry/__main__.py +0 -4
- pkgs/type_spec/actions_registry/emit_typescript.py +5 -5
- pkgs/type_spec/builder.py +438 -109
- pkgs/type_spec/builder_types.py +9 -0
- pkgs/type_spec/config.py +52 -24
- pkgs/type_spec/cross_output_links.py +99 -0
- pkgs/type_spec/emit_io_ts.py +1 -1
- pkgs/type_spec/emit_open_api.py +160 -41
- pkgs/type_spec/emit_open_api_util.py +13 -7
- pkgs/type_spec/emit_python.py +450 -136
- pkgs/type_spec/emit_typescript.py +117 -250
- pkgs/type_spec/emit_typescript_util.py +293 -4
- pkgs/type_spec/load_types.py +20 -5
- pkgs/type_spec/non_discriminated_union_exceptions.py +14 -0
- pkgs/type_spec/open_api_util.py +29 -4
- pkgs/type_spec/parts/base.py.prepart +13 -10
- pkgs/type_spec/parts/base.ts.prepart +4 -0
- pkgs/type_spec/type_info/__main__.py +3 -1
- pkgs/type_spec/type_info/emit_type_info.py +161 -32
- pkgs/type_spec/ui_entry_actions/__init__.py +4 -0
- pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +308 -0
- pkgs/type_spec/util.py +4 -4
- pkgs/type_spec/value_spec/__main__.py +27 -10
- pkgs/type_spec/value_spec/convert_type.py +21 -1
- pkgs/type_spec/value_spec/emit_python.py +25 -7
- pkgs/type_spec/value_spec/types.py +1 -1
- uncountable/__init__.py +1 -2
- uncountable/core/__init__.py +11 -3
- uncountable/core/async_batch.py +16 -1
- uncountable/core/client.py +247 -52
- uncountable/core/environment.py +41 -0
- uncountable/core/file_upload.py +67 -22
- uncountable/core/types.py +8 -13
- uncountable/integration/cli.py +142 -0
- uncountable/integration/construct_client.py +43 -27
- uncountable/integration/cron.py +12 -11
- uncountable/integration/db/connect.py +12 -2
- uncountable/integration/db/session.py +25 -0
- uncountable/integration/entrypoint.py +4 -34
- uncountable/integration/executors/executors.py +147 -0
- uncountable/integration/executors/generic_upload_executor.py +336 -0
- uncountable/integration/executors/script_executor.py +15 -9
- uncountable/integration/http_server/__init__.py +5 -0
- uncountable/integration/http_server/types.py +69 -0
- uncountable/integration/job.py +246 -19
- uncountable/integration/queue_runner/__init__.py +0 -0
- uncountable/integration/queue_runner/command_server/__init__.py +28 -0
- uncountable/integration/queue_runner/command_server/command_client.py +133 -0
- uncountable/integration/queue_runner/command_server/command_server.py +142 -0
- uncountable/integration/queue_runner/command_server/constants.py +4 -0
- uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
- uncountable/integration/queue_runner/command_server/protocol/command_server.proto +58 -0
- uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +57 -0
- uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +114 -0
- uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +264 -0
- uncountable/integration/queue_runner/command_server/types.py +75 -0
- uncountable/integration/queue_runner/datastore/__init__.py +3 -0
- uncountable/integration/queue_runner/datastore/datastore_sqlite.py +250 -0
- uncountable/integration/queue_runner/datastore/interface.py +29 -0
- uncountable/integration/queue_runner/datastore/model.py +24 -0
- uncountable/integration/queue_runner/job_scheduler.py +200 -0
- uncountable/integration/queue_runner/queue_runner.py +34 -0
- uncountable/integration/queue_runner/types.py +7 -0
- uncountable/integration/queue_runner/worker.py +116 -0
- uncountable/integration/scan_profiles.py +67 -0
- uncountable/integration/scheduler.py +199 -0
- uncountable/integration/secret_retrieval/__init__.py +3 -0
- uncountable/integration/secret_retrieval/retrieve_secret.py +93 -0
- uncountable/integration/server.py +103 -54
- uncountable/integration/telemetry.py +251 -0
- uncountable/integration/webhook_server/entrypoint.py +97 -0
- uncountable/types/__init__.py +149 -30
- uncountable/types/api/batch/execute_batch.py +16 -9
- uncountable/types/api/batch/execute_batch_load_async.py +13 -7
- uncountable/types/api/chemical/convert_chemical_formats.py +20 -8
- uncountable/types/api/condition_parameters/__init__.py +1 -0
- uncountable/types/api/condition_parameters/upsert_condition_match.py +72 -0
- uncountable/types/api/entity/create_entities.py +24 -12
- uncountable/types/api/entity/create_entity.py +22 -13
- uncountable/types/api/entity/create_or_update_entity.py +48 -0
- uncountable/types/api/entity/export_entities.py +59 -0
- uncountable/types/api/entity/get_entities_data.py +18 -9
- uncountable/types/api/entity/grant_entity_permissions.py +48 -0
- uncountable/types/api/entity/list_aggregate.py +79 -0
- uncountable/types/api/entity/list_entities.py +53 -14
- uncountable/types/api/entity/lock_entity.py +45 -0
- uncountable/types/api/entity/lookup_entity.py +116 -0
- uncountable/types/api/entity/resolve_entity_ids.py +19 -10
- uncountable/types/api/entity/set_entity_field_values.py +44 -0
- uncountable/types/api/entity/set_values.py +15 -8
- uncountable/types/api/entity/transition_entity_phase.py +27 -12
- uncountable/types/api/entity/unlock_entity.py +44 -0
- uncountable/types/api/equipment/__init__.py +1 -0
- uncountable/types/api/equipment/associate_equipment_input.py +43 -0
- uncountable/types/api/field_options/__init__.py +1 -0
- uncountable/types/api/field_options/upsert_field_options.py +55 -0
- uncountable/types/api/files/__init__.py +1 -0
- uncountable/types/api/files/download_file.py +77 -0
- uncountable/types/api/id_source/list_id_source.py +20 -11
- uncountable/types/api/id_source/match_id_source.py +15 -10
- uncountable/types/api/input_groups/get_input_group_names.py +16 -7
- uncountable/types/api/inputs/create_inputs.py +28 -14
- uncountable/types/api/inputs/get_input_data.py +34 -16
- uncountable/types/api/inputs/get_input_names.py +19 -10
- uncountable/types/api/inputs/get_inputs_data.py +29 -11
- uncountable/types/api/inputs/set_input_attribute_values.py +16 -10
- uncountable/types/api/inputs/set_input_category.py +44 -0
- uncountable/types/api/inputs/set_input_subcategories.py +45 -0
- uncountable/types/api/inputs/set_intermediate_type.py +50 -0
- uncountable/types/api/integrations/__init__.py +1 -0
- uncountable/types/api/integrations/publish_realtime_data.py +41 -0
- uncountable/types/api/integrations/push_notification.py +49 -0
- uncountable/types/api/integrations/register_sockets_token.py +41 -0
- uncountable/types/api/listing/__init__.py +1 -0
- uncountable/types/api/listing/fetch_listing.py +58 -0
- uncountable/types/api/material_families/__init__.py +1 -0
- uncountable/types/api/material_families/update_entity_material_families.py +47 -0
- uncountable/types/api/notebooks/__init__.py +1 -0
- uncountable/types/api/notebooks/add_notebook_content.py +119 -0
- uncountable/types/api/outputs/get_output_data.py +32 -17
- uncountable/types/api/outputs/get_output_names.py +18 -9
- uncountable/types/api/outputs/get_output_organization.py +173 -0
- uncountable/types/api/outputs/resolve_output_conditions.py +23 -11
- uncountable/types/api/permissions/set_core_permissions.py +31 -15
- uncountable/types/api/project/get_projects.py +20 -11
- uncountable/types/api/project/get_projects_data.py +23 -14
- uncountable/types/api/recipe_links/create_recipe_link.py +17 -10
- uncountable/types/api/recipe_links/remove_recipe_link.py +45 -0
- uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +19 -10
- uncountable/types/api/recipes/add_recipe_to_project.py +42 -0
- uncountable/types/api/recipes/add_time_series_data.py +64 -0
- uncountable/types/api/recipes/archive_recipes.py +14 -7
- uncountable/types/api/recipes/associate_recipe_as_input.py +16 -8
- uncountable/types/api/recipes/associate_recipe_as_lot.py +14 -7
- uncountable/types/api/recipes/clear_recipe_outputs.py +42 -0
- uncountable/types/api/recipes/create_mix_order.py +44 -0
- uncountable/types/api/recipes/create_recipe.py +21 -14
- uncountable/types/api/recipes/create_recipes.py +25 -13
- uncountable/types/api/recipes/disassociate_recipe_as_input.py +14 -7
- uncountable/types/api/recipes/edit_recipe_inputs.py +208 -19
- uncountable/types/api/recipes/get_column_calculation_values.py +57 -0
- uncountable/types/api/recipes/get_curve.py +15 -9
- uncountable/types/api/recipes/get_recipe_calculations.py +17 -11
- uncountable/types/api/recipes/get_recipe_links.py +14 -8
- uncountable/types/api/recipes/get_recipe_names.py +16 -7
- uncountable/types/api/recipes/get_recipe_output_metadata.py +16 -10
- uncountable/types/api/recipes/get_recipes_data.py +96 -45
- uncountable/types/api/recipes/lock_recipes.py +64 -0
- uncountable/types/api/recipes/remove_recipe_from_project.py +42 -0
- uncountable/types/api/recipes/set_recipe_inputs.py +19 -13
- uncountable/types/api/recipes/set_recipe_metadata.py +14 -7
- uncountable/types/api/recipes/set_recipe_output_annotations.py +114 -0
- uncountable/types/api/recipes/set_recipe_output_file.py +55 -0
- uncountable/types/api/recipes/set_recipe_outputs.py +40 -15
- uncountable/types/api/recipes/set_recipe_tags.py +30 -13
- uncountable/types/api/recipes/set_recipe_total.py +59 -0
- uncountable/types/api/recipes/unarchive_recipes.py +41 -0
- uncountable/types/api/recipes/unlock_recipes.py +51 -0
- uncountable/types/api/runsheet/__init__.py +1 -0
- uncountable/types/api/runsheet/complete_async_upload.py +41 -0
- uncountable/types/api/triggers/run_trigger.py +15 -8
- uncountable/types/api/uploader/__init__.py +1 -0
- uncountable/types/api/uploader/complete_async_parse.py +46 -0
- uncountable/types/api/uploader/invoke_uploader.py +46 -0
- uncountable/types/api/user/__init__.py +1 -0
- uncountable/types/api/user/get_current_user_info.py +40 -0
- uncountable/types/async_batch.py +8 -52
- uncountable/types/async_batch_processor.py +694 -18
- uncountable/types/async_batch_t.py +108 -0
- uncountable/types/async_jobs.py +8 -0
- uncountable/types/async_jobs_t.py +52 -0
- uncountable/types/auth_retrieval.py +11 -0
- uncountable/types/auth_retrieval_t.py +75 -0
- uncountable/types/base.py +5 -80
- uncountable/types/base_t.py +87 -0
- uncountable/types/calculations.py +3 -19
- uncountable/types/calculations_t.py +26 -0
- uncountable/types/chemical_structure.py +3 -23
- uncountable/types/chemical_structure_t.py +28 -0
- uncountable/types/client_base.py +1170 -88
- uncountable/types/client_config.py +8 -0
- uncountable/types/client_config_t.py +36 -0
- uncountable/types/curves.py +5 -43
- uncountable/types/curves_t.py +50 -0
- uncountable/types/data.py +12 -0
- uncountable/types/data_t.py +103 -0
- uncountable/types/entity.py +8 -270
- uncountable/types/entity_t.py +446 -0
- uncountable/types/experiment_groups.py +3 -19
- uncountable/types/experiment_groups_t.py +26 -0
- uncountable/types/exports.py +8 -0
- uncountable/types/exports_t.py +34 -0
- uncountable/types/field_values.py +25 -61
- uncountable/types/field_values_t.py +302 -0
- uncountable/types/fields.py +3 -20
- uncountable/types/fields_t.py +27 -0
- uncountable/types/generic_upload.py +14 -0
- uncountable/types/generic_upload_t.py +119 -0
- uncountable/types/id_source.py +7 -45
- uncountable/types/id_source_t.py +68 -0
- uncountable/types/identifier.py +6 -50
- uncountable/types/identifier_t.py +62 -0
- uncountable/types/input_attributes.py +3 -25
- uncountable/types/input_attributes_t.py +29 -0
- uncountable/types/inputs.py +6 -57
- uncountable/types/inputs_t.py +82 -0
- uncountable/types/integration_server.py +8 -0
- uncountable/types/integration_server_t.py +46 -0
- uncountable/types/integration_session.py +10 -0
- uncountable/types/integration_session_t.py +60 -0
- uncountable/types/integrations.py +10 -0
- uncountable/types/integrations_t.py +62 -0
- uncountable/types/job_definition.py +28 -0
- uncountable/types/job_definition_t.py +285 -0
- uncountable/types/listing.py +9 -0
- uncountable/types/listing_t.py +51 -0
- uncountable/types/notices.py +8 -0
- uncountable/types/notices_t.py +37 -0
- uncountable/types/notifications.py +11 -0
- uncountable/types/notifications_t.py +74 -0
- uncountable/types/outputs.py +3 -22
- uncountable/types/outputs_t.py +29 -0
- uncountable/types/overrides.py +9 -0
- uncountable/types/overrides_t.py +49 -0
- uncountable/types/permissions.py +3 -42
- uncountable/types/permissions_t.py +45 -0
- uncountable/types/phases.py +3 -19
- uncountable/types/phases_t.py +26 -0
- uncountable/types/post_base.py +3 -26
- uncountable/types/post_base_t.py +29 -0
- uncountable/types/queued_job.py +17 -0
- uncountable/types/queued_job_t.py +140 -0
- uncountable/types/recipe_identifiers.py +7 -58
- uncountable/types/recipe_identifiers_t.py +75 -0
- uncountable/types/recipe_inputs.py +4 -26
- uncountable/types/recipe_inputs_t.py +29 -0
- uncountable/types/recipe_links.py +4 -46
- uncountable/types/recipe_links_t.py +53 -0
- uncountable/types/recipe_metadata.py +5 -48
- uncountable/types/recipe_metadata_t.py +57 -0
- uncountable/types/recipe_output_metadata.py +3 -20
- uncountable/types/recipe_output_metadata_t.py +27 -0
- uncountable/types/recipe_tags.py +3 -19
- uncountable/types/recipe_tags_t.py +26 -0
- uncountable/types/recipe_workflow_steps.py +9 -73
- uncountable/types/recipe_workflow_steps_t.py +95 -0
- uncountable/types/recipes.py +7 -0
- uncountable/types/recipes_t.py +25 -0
- uncountable/types/response.py +3 -21
- uncountable/types/response_t.py +26 -0
- uncountable/types/secret_retrieval.py +11 -0
- uncountable/types/secret_retrieval_t.py +75 -0
- uncountable/types/sockets.py +20 -0
- uncountable/types/sockets_t.py +169 -0
- uncountable/types/structured_filters.py +25 -0
- uncountable/types/structured_filters_t.py +248 -0
- uncountable/types/units.py +3 -19
- uncountable/types/units_t.py +26 -0
- uncountable/types/uploader.py +24 -0
- uncountable/types/uploader_t.py +222 -0
- uncountable/types/users.py +3 -20
- uncountable/types/users_t.py +27 -0
- uncountable/types/webhook_job.py +9 -0
- uncountable/types/webhook_job_t.py +48 -0
- uncountable/types/workflows.py +4 -28
- uncountable/types/workflows_t.py +38 -0
- uncountablepythonsdk-0.0.131.dist-info/METADATA +64 -0
- uncountablepythonsdk-0.0.131.dist-info/RECORD +363 -0
- {UncountablePythonSDK-0.0.24.dist-info → uncountablepythonsdk-0.0.131.dist-info}/WHEEL +1 -1
- {UncountablePythonSDK-0.0.24.dist-info → uncountablepythonsdk-0.0.131.dist-info}/top_level.txt +0 -1
- UncountablePythonSDK-0.0.24.dist-info/METADATA +0 -47
- UncountablePythonSDK-0.0.24.dist-info/RECORD +0 -216
- docs/quickstart.md +0 -19
- examples/recipe-import/importer.py +0 -39
- type_spec/external/api/batch/execute_batch.yaml +0 -56
- type_spec/external/api/batch/execute_batch_load_async.yaml +0 -18
- type_spec/external/api/chemical/convert_chemical_formats.yaml +0 -33
- type_spec/external/api/entity/create_entities.yaml +0 -45
- type_spec/external/api/entity/create_entity.yaml +0 -51
- type_spec/external/api/entity/get_entities_data.yaml +0 -29
- type_spec/external/api/entity/list_entities.yaml +0 -52
- type_spec/external/api/entity/resolve_entity_ids.yaml +0 -29
- type_spec/external/api/entity/set_values.yaml +0 -18
- type_spec/external/api/entity/transition_entity_phase.yaml +0 -44
- type_spec/external/api/id_source/list_id_source.yaml +0 -35
- type_spec/external/api/id_source/match_id_source.yaml +0 -32
- type_spec/external/api/input_groups/get_input_group_names.yaml +0 -29
- type_spec/external/api/inputs/create_inputs.yaml +0 -48
- type_spec/external/api/inputs/get_input_data.yaml +0 -95
- type_spec/external/api/inputs/get_input_names.yaml +0 -38
- type_spec/external/api/inputs/get_inputs_data.yaml +0 -82
- type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -33
- type_spec/external/api/outputs/get_output_data.yaml +0 -92
- type_spec/external/api/outputs/get_output_names.yaml +0 -35
- type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -50
- type_spec/external/api/permissions/set_core_permissions.yaml +0 -69
- type_spec/external/api/project/get_projects.yaml +0 -42
- type_spec/external/api/project/get_projects_data.yaml +0 -50
- type_spec/external/api/recipe_links/create_recipe_link.yaml +0 -25
- type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -41
- type_spec/external/api/recipes/archive_recipes.yaml +0 -20
- type_spec/external/api/recipes/associate_recipe_as_input.yaml +0 -19
- type_spec/external/api/recipes/associate_recipe_as_lot.yaml +0 -19
- type_spec/external/api/recipes/create_recipe.yaml +0 -39
- type_spec/external/api/recipes/create_recipes.yaml +0 -47
- type_spec/external/api/recipes/disassociate_recipe_as_input.yaml +0 -16
- type_spec/external/api/recipes/edit_recipe_inputs.yaml +0 -85
- type_spec/external/api/recipes/get_curve.yaml +0 -21
- type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -39
- type_spec/external/api/recipes/get_recipe_links.yaml +0 -26
- type_spec/external/api/recipes/get_recipe_names.yaml +0 -29
- type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -36
- type_spec/external/api/recipes/get_recipes_data.yaml +0 -244
- type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -42
- type_spec/external/api/recipes/set_recipe_metadata.yaml +0 -20
- type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -52
- type_spec/external/api/recipes/set_recipe_tags.yaml +0 -62
- type_spec/external/api/triggers/run_trigger.yaml +0 -18
- uncountable/integration/types.py +0 -89
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
import time
|
|
5
|
+
import traceback
|
|
6
|
+
import typing
|
|
7
|
+
from contextlib import contextmanager
|
|
8
|
+
from enum import StrEnum
|
|
9
|
+
from typing import Generator, assert_never, cast
|
|
10
|
+
|
|
11
|
+
from opentelemetry import _logs, trace
|
|
12
|
+
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
|
|
13
|
+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
|
|
14
|
+
from opentelemetry.sdk._logs import Logger as OTELLogger
|
|
15
|
+
from opentelemetry.sdk._logs import (
|
|
16
|
+
LoggerProvider,
|
|
17
|
+
LogRecord,
|
|
18
|
+
)
|
|
19
|
+
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, ConsoleLogExporter
|
|
20
|
+
from opentelemetry.sdk.resources import Attributes, Resource
|
|
21
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
22
|
+
from opentelemetry.sdk.trace.export import (
|
|
23
|
+
SimpleSpanProcessor,
|
|
24
|
+
)
|
|
25
|
+
from opentelemetry.trace import DEFAULT_TRACE_OPTIONS, Span, Tracer
|
|
26
|
+
|
|
27
|
+
from uncountable.core.environment import (
|
|
28
|
+
get_otel_enabled,
|
|
29
|
+
get_server_env,
|
|
30
|
+
get_version,
|
|
31
|
+
)
|
|
32
|
+
from uncountable.types import base_t, job_definition_t
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _cast_attributes(attributes: dict[str, base_t.JsonValue]) -> Attributes:
|
|
36
|
+
return cast(Attributes, attributes)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def one_line_formatter(record: LogRecord) -> str:
|
|
40
|
+
json_data = record.to_json()
|
|
41
|
+
return json.dumps(json.loads(json_data), separators=(",", ":")) + "\n"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@functools.cache
|
|
45
|
+
def get_otel_resource() -> Resource:
|
|
46
|
+
attributes: dict[str, base_t.JsonValue] = {
|
|
47
|
+
"service.name": "integration-server",
|
|
48
|
+
"sdk.version": get_version(),
|
|
49
|
+
}
|
|
50
|
+
unc_version = os.environ.get("UNC_VERSION")
|
|
51
|
+
if unc_version is not None:
|
|
52
|
+
attributes["service.version"] = unc_version
|
|
53
|
+
unc_env = get_server_env()
|
|
54
|
+
if unc_env is not None:
|
|
55
|
+
attributes["deployment.environment"] = unc_env
|
|
56
|
+
resource = Resource.create(attributes=_cast_attributes(attributes))
|
|
57
|
+
return resource
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@functools.cache
|
|
61
|
+
def get_otel_tracer() -> Tracer:
|
|
62
|
+
provider = TracerProvider(resource=get_otel_resource())
|
|
63
|
+
if get_otel_enabled():
|
|
64
|
+
provider.add_span_processor(SimpleSpanProcessor(OTLPSpanExporter()))
|
|
65
|
+
trace.set_tracer_provider(provider)
|
|
66
|
+
return provider.get_tracer("integration.telemetry")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@functools.cache
|
|
70
|
+
def get_otel_logger() -> OTELLogger:
|
|
71
|
+
provider = LoggerProvider(resource=get_otel_resource())
|
|
72
|
+
provider.add_log_record_processor(
|
|
73
|
+
BatchLogRecordProcessor(ConsoleLogExporter(formatter=one_line_formatter))
|
|
74
|
+
)
|
|
75
|
+
if get_otel_enabled():
|
|
76
|
+
provider.add_log_record_processor(BatchLogRecordProcessor(OTLPLogExporter()))
|
|
77
|
+
_logs.set_logger_provider(provider)
|
|
78
|
+
return provider.get_logger("integration.telemetry")
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class LogSeverity(StrEnum):
|
|
82
|
+
INFO = "Info"
|
|
83
|
+
WARN = "Warn"
|
|
84
|
+
ERROR = "Error"
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class Logger:
|
|
88
|
+
current_span: Span
|
|
89
|
+
|
|
90
|
+
def __init__(self, base_span: Span) -> None:
|
|
91
|
+
self.current_span = base_span
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def current_span_id(self) -> int:
|
|
95
|
+
return self.current_span.get_span_context().span_id
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def current_trace_id(self) -> int | None:
|
|
99
|
+
return self.current_span.get_span_context().trace_id
|
|
100
|
+
|
|
101
|
+
def _patch_attributes(
|
|
102
|
+
self,
|
|
103
|
+
attributes: Attributes | None,
|
|
104
|
+
*,
|
|
105
|
+
message: str | None = None,
|
|
106
|
+
severity: LogSeverity | None = None,
|
|
107
|
+
) -> Attributes:
|
|
108
|
+
patched_attributes = {**(attributes if attributes is not None else {})}
|
|
109
|
+
if message is not None:
|
|
110
|
+
patched_attributes["message"] = message
|
|
111
|
+
elif "body" in patched_attributes:
|
|
112
|
+
patched_attributes["message"] = patched_attributes["body"]
|
|
113
|
+
|
|
114
|
+
if severity is not None:
|
|
115
|
+
patched_attributes["status"] = severity.lower()
|
|
116
|
+
elif "severity_text" in patched_attributes and isinstance(
|
|
117
|
+
patched_attributes["severity_text"], str
|
|
118
|
+
):
|
|
119
|
+
patched_attributes["status"] = patched_attributes["severity_text"].lower()
|
|
120
|
+
|
|
121
|
+
return patched_attributes
|
|
122
|
+
|
|
123
|
+
def _emit_log(
|
|
124
|
+
self, message: str, *, severity: LogSeverity, attributes: Attributes | None
|
|
125
|
+
) -> None:
|
|
126
|
+
otel_logger = get_otel_logger()
|
|
127
|
+
log_record = LogRecord(
|
|
128
|
+
body=message,
|
|
129
|
+
severity_text=severity,
|
|
130
|
+
timestamp=time.time_ns(),
|
|
131
|
+
attributes=self._patch_attributes(
|
|
132
|
+
message=message, severity=severity, attributes=attributes
|
|
133
|
+
),
|
|
134
|
+
span_id=self.current_span_id,
|
|
135
|
+
trace_id=self.current_trace_id,
|
|
136
|
+
trace_flags=DEFAULT_TRACE_OPTIONS,
|
|
137
|
+
severity_number=_logs.SeverityNumber.UNSPECIFIED,
|
|
138
|
+
resource=get_otel_resource(),
|
|
139
|
+
)
|
|
140
|
+
otel_logger.emit(log_record)
|
|
141
|
+
|
|
142
|
+
def log_info(self, message: str, *, attributes: Attributes | None = None) -> None:
|
|
143
|
+
self._emit_log(
|
|
144
|
+
message=message, severity=LogSeverity.INFO, attributes=attributes
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
def log_warning(
|
|
148
|
+
self, message: str, *, attributes: Attributes | None = None
|
|
149
|
+
) -> None:
|
|
150
|
+
self._emit_log(
|
|
151
|
+
message=message, severity=LogSeverity.WARN, attributes=attributes
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
def log_error(self, message: str, *, attributes: Attributes | None = None) -> None:
|
|
155
|
+
self._emit_log(
|
|
156
|
+
message=message, severity=LogSeverity.ERROR, attributes=attributes
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
def log_exception(
|
|
160
|
+
self,
|
|
161
|
+
exception: BaseException,
|
|
162
|
+
*,
|
|
163
|
+
message: str | None = None,
|
|
164
|
+
attributes: Attributes | None = None,
|
|
165
|
+
) -> None:
|
|
166
|
+
traceback_str = "".join(traceback.format_exception(exception))
|
|
167
|
+
patched_attributes = self._patch_attributes(
|
|
168
|
+
message=message, severity=LogSeverity.ERROR, attributes=attributes
|
|
169
|
+
)
|
|
170
|
+
self.current_span.record_exception(
|
|
171
|
+
exception=exception, attributes=patched_attributes
|
|
172
|
+
)
|
|
173
|
+
self.log_error(
|
|
174
|
+
message=f"error: {message}\nexception: {exception}{traceback_str}",
|
|
175
|
+
attributes=patched_attributes,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
@contextmanager
|
|
179
|
+
def push_scope(
|
|
180
|
+
self, scope_name: str, *, attributes: Attributes | None = None
|
|
181
|
+
) -> Generator[typing.Self, None, None]:
|
|
182
|
+
with get_otel_tracer().start_as_current_span(
|
|
183
|
+
scope_name, attributes=self._patch_attributes(attributes)
|
|
184
|
+
):
|
|
185
|
+
yield self
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class JobLogger(Logger):
|
|
189
|
+
def __init__(
|
|
190
|
+
self,
|
|
191
|
+
*,
|
|
192
|
+
base_span: Span,
|
|
193
|
+
profile_metadata: job_definition_t.ProfileMetadata,
|
|
194
|
+
job_definition: job_definition_t.JobDefinition,
|
|
195
|
+
) -> None:
|
|
196
|
+
self.profile_metadata = profile_metadata
|
|
197
|
+
self.job_definition = job_definition
|
|
198
|
+
super().__init__(base_span)
|
|
199
|
+
|
|
200
|
+
def _patch_attributes(
|
|
201
|
+
self,
|
|
202
|
+
attributes: Attributes | None,
|
|
203
|
+
*,
|
|
204
|
+
message: str | None = None,
|
|
205
|
+
severity: LogSeverity | None = None,
|
|
206
|
+
) -> Attributes:
|
|
207
|
+
patched_attributes: dict[str, base_t.JsonValue] = {
|
|
208
|
+
**super()._patch_attributes(
|
|
209
|
+
attributes=attributes, message=message, severity=severity
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
patched_attributes["profile.name"] = self.profile_metadata.name
|
|
213
|
+
patched_attributes["profile.base_url"] = self.profile_metadata.base_url
|
|
214
|
+
patched_attributes["job.name"] = self.job_definition.name
|
|
215
|
+
patched_attributes["job.id"] = self.job_definition.id
|
|
216
|
+
patched_attributes["job.definition_type"] = self.job_definition.type
|
|
217
|
+
match self.job_definition:
|
|
218
|
+
case job_definition_t.CronJobDefinition():
|
|
219
|
+
patched_attributes["job.definition.cron_spec"] = (
|
|
220
|
+
self.job_definition.cron_spec
|
|
221
|
+
)
|
|
222
|
+
case job_definition_t.HttpJobDefinitionBase():
|
|
223
|
+
pass
|
|
224
|
+
case _:
|
|
225
|
+
assert_never(self.job_definition)
|
|
226
|
+
patched_attributes["job.definition.executor.type"] = (
|
|
227
|
+
self.job_definition.executor.type
|
|
228
|
+
)
|
|
229
|
+
match self.job_definition.executor:
|
|
230
|
+
case job_definition_t.JobExecutorScript():
|
|
231
|
+
patched_attributes["job.definition.executor.import_path"] = (
|
|
232
|
+
self.job_definition.executor.import_path
|
|
233
|
+
)
|
|
234
|
+
case job_definition_t.JobExecutorGenericUpload():
|
|
235
|
+
patched_attributes["job.definition.executor.data_source.type"] = (
|
|
236
|
+
self.job_definition.executor.data_source.type
|
|
237
|
+
)
|
|
238
|
+
case _:
|
|
239
|
+
assert_never(self.job_definition.executor)
|
|
240
|
+
return _cast_attributes(patched_attributes)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
@contextmanager
|
|
244
|
+
def push_scope_optional(
|
|
245
|
+
logger: Logger | None, scope_name: str, *, attributes: Attributes | None = None
|
|
246
|
+
) -> Generator[None, None, None]:
|
|
247
|
+
if logger is None:
|
|
248
|
+
yield
|
|
249
|
+
else:
|
|
250
|
+
with logger.push_scope(scope_name, attributes=attributes):
|
|
251
|
+
yield
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
|
|
3
|
+
import flask
|
|
4
|
+
from flask.typing import ResponseReturnValue
|
|
5
|
+
from opentelemetry.trace import get_current_span
|
|
6
|
+
from uncountable.core.environment import (
|
|
7
|
+
get_http_server_port,
|
|
8
|
+
get_server_env,
|
|
9
|
+
)
|
|
10
|
+
from uncountable.integration.executors.script_executor import resolve_script_executor
|
|
11
|
+
from uncountable.integration.http_server import GenericHttpRequest, HttpException
|
|
12
|
+
from uncountable.integration.job import CustomHttpJob, WebhookJob
|
|
13
|
+
from uncountable.integration.scan_profiles import load_profiles
|
|
14
|
+
from uncountable.integration.telemetry import Logger
|
|
15
|
+
from uncountable.types import job_definition_t
|
|
16
|
+
|
|
17
|
+
app = flask.Flask(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def register_route(
|
|
21
|
+
*,
|
|
22
|
+
server_logger: Logger,
|
|
23
|
+
profile_meta: job_definition_t.ProfileMetadata,
|
|
24
|
+
job: job_definition_t.HttpJobDefinitionBase,
|
|
25
|
+
) -> None:
|
|
26
|
+
route = f"/{profile_meta.name}/{job.id}"
|
|
27
|
+
|
|
28
|
+
def handle_request() -> ResponseReturnValue:
|
|
29
|
+
with server_logger.push_scope(route):
|
|
30
|
+
try:
|
|
31
|
+
if not isinstance(job.executor, job_definition_t.JobExecutorScript):
|
|
32
|
+
raise HttpException.configuration_error(
|
|
33
|
+
message="[internal] http job must use a script executor"
|
|
34
|
+
)
|
|
35
|
+
job_instance = resolve_script_executor(
|
|
36
|
+
executor=job.executor, profile_metadata=profile_meta
|
|
37
|
+
)
|
|
38
|
+
if not isinstance(job_instance, (CustomHttpJob, WebhookJob)):
|
|
39
|
+
raise HttpException.configuration_error(
|
|
40
|
+
message="[internal] http job must descend from CustomHttpJob"
|
|
41
|
+
)
|
|
42
|
+
http_request = GenericHttpRequest(
|
|
43
|
+
body_base64=base64.b64encode(flask.request.get_data()).decode(),
|
|
44
|
+
headers=dict(flask.request.headers),
|
|
45
|
+
)
|
|
46
|
+
job_instance.validate_request(
|
|
47
|
+
request=http_request, job_definition=job, profile_meta=profile_meta
|
|
48
|
+
)
|
|
49
|
+
http_response = job_instance.handle_request(
|
|
50
|
+
request=http_request, job_definition=job, profile_meta=profile_meta
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return flask.make_response(
|
|
54
|
+
http_response.response,
|
|
55
|
+
http_response.status_code,
|
|
56
|
+
http_response.headers,
|
|
57
|
+
)
|
|
58
|
+
except HttpException as e:
|
|
59
|
+
server_logger.log_exception(e)
|
|
60
|
+
return e.make_error_response()
|
|
61
|
+
except Exception as e:
|
|
62
|
+
server_logger.log_exception(e)
|
|
63
|
+
return HttpException.unknown_error().make_error_response()
|
|
64
|
+
|
|
65
|
+
app.add_url_rule(
|
|
66
|
+
route,
|
|
67
|
+
endpoint=f"handle_request_{job.id}",
|
|
68
|
+
view_func=handle_request,
|
|
69
|
+
methods=["POST"],
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
server_logger.log_info(f"job {job.id} webhook registered at: {route}")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def main() -> None:
|
|
76
|
+
app.add_url_rule("/health", "health", lambda: ("OK", 200))
|
|
77
|
+
|
|
78
|
+
profiles = load_profiles()
|
|
79
|
+
for profile_metadata in profiles:
|
|
80
|
+
server_logger = Logger(get_current_span())
|
|
81
|
+
for job in profile_metadata.jobs:
|
|
82
|
+
if isinstance(job, job_definition_t.HttpJobDefinitionBase):
|
|
83
|
+
register_route(
|
|
84
|
+
server_logger=server_logger, profile_meta=profile_metadata, job=job
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
main()
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if __name__ == "__main__":
|
|
92
|
+
app.run(
|
|
93
|
+
host="0.0.0.0",
|
|
94
|
+
port=get_http_server_port(),
|
|
95
|
+
debug=get_server_env() == "playground",
|
|
96
|
+
exclude_patterns=[],
|
|
97
|
+
)
|
uncountable/types/__init__.py
CHANGED
|
@@ -1,31 +1,50 @@
|
|
|
1
1
|
# DO NOT MODIFY -- This file is generated by type_spec
|
|
2
|
-
#
|
|
3
|
-
# ruff: noqa: E402
|
|
2
|
+
# ruff: noqa: E402 Q003
|
|
4
3
|
# fmt: off
|
|
5
4
|
# isort: skip_file
|
|
5
|
+
from .api.notebooks import add_notebook_content as add_notebook_content_t
|
|
6
|
+
from .api.recipes import add_recipe_to_project as add_recipe_to_project_t
|
|
7
|
+
from .api.recipes import add_time_series_data as add_time_series_data_t
|
|
6
8
|
from .api.recipes import archive_recipes as archive_recipes_t
|
|
9
|
+
from .api.equipment import associate_equipment_input as associate_equipment_input_t
|
|
7
10
|
from .api.recipes import associate_recipe_as_input as associate_recipe_as_input_t
|
|
8
11
|
from .api.recipes import associate_recipe_as_lot as associate_recipe_as_lot_t
|
|
9
|
-
from . import
|
|
10
|
-
from . import
|
|
11
|
-
from . import
|
|
12
|
-
from . import
|
|
12
|
+
from . import async_batch_t as async_batch_t
|
|
13
|
+
from . import async_jobs_t as async_jobs_t
|
|
14
|
+
from . import auth_retrieval_t as auth_retrieval_t
|
|
15
|
+
from . import base_t as base_t
|
|
16
|
+
from . import calculations_t as calculations_t
|
|
17
|
+
from . import chemical_structure_t as chemical_structure_t
|
|
18
|
+
from .api.recipes import clear_recipe_outputs as clear_recipe_outputs_t
|
|
19
|
+
from . import client_config_t as client_config_t
|
|
20
|
+
from .api.uploader import complete_async_parse as complete_async_parse_t
|
|
21
|
+
from .api.runsheet import complete_async_upload as complete_async_upload_t
|
|
13
22
|
from .api.chemical import convert_chemical_formats as convert_chemical_formats_t
|
|
14
23
|
from .api.entity import create_entities as create_entities_t
|
|
15
24
|
from .api.entity import create_entity as create_entity_t
|
|
16
25
|
from .api.inputs import create_inputs as create_inputs_t
|
|
26
|
+
from .api.recipes import create_mix_order as create_mix_order_t
|
|
27
|
+
from .api.entity import create_or_update_entity as create_or_update_entity_t
|
|
17
28
|
from .api.recipes import create_recipe as create_recipe_t
|
|
18
29
|
from .api.recipe_links import create_recipe_link as create_recipe_link_t
|
|
19
30
|
from .api.recipes import create_recipes as create_recipes_t
|
|
20
|
-
from . import
|
|
31
|
+
from . import curves_t as curves_t
|
|
32
|
+
from . import data_t as data_t
|
|
21
33
|
from .api.recipes import disassociate_recipe_as_input as disassociate_recipe_as_input_t
|
|
34
|
+
from .api.files import download_file as download_file_t
|
|
22
35
|
from .api.recipes import edit_recipe_inputs as edit_recipe_inputs_t
|
|
23
|
-
from . import
|
|
36
|
+
from . import entity_t as entity_t
|
|
24
37
|
from .api.batch import execute_batch as execute_batch_t
|
|
25
38
|
from .api.batch import execute_batch_load_async as execute_batch_load_async_t
|
|
26
|
-
from . import
|
|
27
|
-
from . import
|
|
28
|
-
from . import
|
|
39
|
+
from . import experiment_groups_t as experiment_groups_t
|
|
40
|
+
from .api.entity import export_entities as export_entities_t
|
|
41
|
+
from . import exports_t as exports_t
|
|
42
|
+
from .api.listing import fetch_listing as fetch_listing_t
|
|
43
|
+
from . import field_values_t as field_values_t
|
|
44
|
+
from . import fields_t as fields_t
|
|
45
|
+
from . import generic_upload_t as generic_upload_t
|
|
46
|
+
from .api.recipes import get_column_calculation_values as get_column_calculation_values_t
|
|
47
|
+
from .api.user import get_current_user_info as get_current_user_info_t
|
|
29
48
|
from .api.recipes import get_curve as get_curve_t
|
|
30
49
|
from .api.entity import get_entities_data as get_entities_data_t
|
|
31
50
|
from .api.inputs import get_input_data as get_input_data_t
|
|
@@ -34,6 +53,7 @@ from .api.inputs import get_input_names as get_input_names_t
|
|
|
34
53
|
from .api.inputs import get_inputs_data as get_inputs_data_t
|
|
35
54
|
from .api.outputs import get_output_data as get_output_data_t
|
|
36
55
|
from .api.outputs import get_output_names as get_output_names_t
|
|
56
|
+
from .api.outputs import get_output_organization as get_output_organization_t
|
|
37
57
|
from .api.project import get_projects as get_projects_t
|
|
38
58
|
from .api.project import get_projects_data as get_projects_data_t
|
|
39
59
|
from .api.recipes import get_recipe_calculations as get_recipe_calculations_t
|
|
@@ -42,65 +62,124 @@ from .api.recipe_metadata import get_recipe_metadata_data as get_recipe_metadata
|
|
|
42
62
|
from .api.recipes import get_recipe_names as get_recipe_names_t
|
|
43
63
|
from .api.recipes import get_recipe_output_metadata as get_recipe_output_metadata_t
|
|
44
64
|
from .api.recipes import get_recipes_data as get_recipes_data_t
|
|
45
|
-
from . import
|
|
46
|
-
from . import
|
|
47
|
-
from . import
|
|
48
|
-
from . import
|
|
65
|
+
from .api.entity import grant_entity_permissions as grant_entity_permissions_t
|
|
66
|
+
from . import id_source_t as id_source_t
|
|
67
|
+
from . import identifier_t as identifier_t
|
|
68
|
+
from . import input_attributes_t as input_attributes_t
|
|
69
|
+
from . import inputs_t as inputs_t
|
|
70
|
+
from . import integration_server_t as integration_server_t
|
|
71
|
+
from . import integration_session_t as integration_session_t
|
|
72
|
+
from . import integrations_t as integrations_t
|
|
73
|
+
from .api.uploader import invoke_uploader as invoke_uploader_t
|
|
74
|
+
from . import job_definition_t as job_definition_t
|
|
75
|
+
from .api.entity import list_aggregate as list_aggregate_t
|
|
49
76
|
from .api.entity import list_entities as list_entities_t
|
|
50
77
|
from .api.id_source import list_id_source as list_id_source_t
|
|
78
|
+
from . import listing_t as listing_t
|
|
79
|
+
from .api.entity import lock_entity as lock_entity_t
|
|
80
|
+
from .api.recipes import lock_recipes as lock_recipes_t
|
|
81
|
+
from .api.entity import lookup_entity as lookup_entity_t
|
|
51
82
|
from .api.id_source import match_id_source as match_id_source_t
|
|
52
|
-
from . import
|
|
53
|
-
from . import
|
|
54
|
-
from . import
|
|
55
|
-
from . import
|
|
56
|
-
from . import
|
|
57
|
-
from . import
|
|
58
|
-
from . import
|
|
59
|
-
from . import
|
|
60
|
-
from . import
|
|
61
|
-
from . import
|
|
62
|
-
from . import
|
|
83
|
+
from . import notices_t as notices_t
|
|
84
|
+
from . import notifications_t as notifications_t
|
|
85
|
+
from . import outputs_t as outputs_t
|
|
86
|
+
from . import overrides_t as overrides_t
|
|
87
|
+
from . import permissions_t as permissions_t
|
|
88
|
+
from . import phases_t as phases_t
|
|
89
|
+
from . import post_base_t as post_base_t
|
|
90
|
+
from .api.integrations import publish_realtime_data as publish_realtime_data_t
|
|
91
|
+
from .api.integrations import push_notification as push_notification_t
|
|
92
|
+
from . import queued_job_t as queued_job_t
|
|
93
|
+
from . import recipe_identifiers_t as recipe_identifiers_t
|
|
94
|
+
from . import recipe_inputs_t as recipe_inputs_t
|
|
95
|
+
from . import recipe_links_t as recipe_links_t
|
|
96
|
+
from . import recipe_metadata_t as recipe_metadata_t
|
|
97
|
+
from . import recipe_output_metadata_t as recipe_output_metadata_t
|
|
98
|
+
from . import recipe_tags_t as recipe_tags_t
|
|
99
|
+
from . import recipe_workflow_steps_t as recipe_workflow_steps_t
|
|
100
|
+
from . import recipes_t as recipes_t
|
|
101
|
+
from .api.integrations import register_sockets_token as register_sockets_token_t
|
|
102
|
+
from .api.recipes import remove_recipe_from_project as remove_recipe_from_project_t
|
|
103
|
+
from .api.recipe_links import remove_recipe_link as remove_recipe_link_t
|
|
63
104
|
from .api.entity import resolve_entity_ids as resolve_entity_ids_t
|
|
64
105
|
from .api.outputs import resolve_output_conditions as resolve_output_conditions_t
|
|
65
|
-
from . import
|
|
106
|
+
from . import response_t as response_t
|
|
66
107
|
from .api.triggers import run_trigger as run_trigger_t
|
|
108
|
+
from . import secret_retrieval_t as secret_retrieval_t
|
|
67
109
|
from .api.permissions import set_core_permissions as set_core_permissions_t
|
|
110
|
+
from .api.entity import set_entity_field_values as set_entity_field_values_t
|
|
68
111
|
from .api.inputs import set_input_attribute_values as set_input_attribute_values_t
|
|
112
|
+
from .api.inputs import set_input_category as set_input_category_t
|
|
113
|
+
from .api.inputs import set_input_subcategories as set_input_subcategories_t
|
|
114
|
+
from .api.inputs import set_intermediate_type as set_intermediate_type_t
|
|
69
115
|
from .api.recipes import set_recipe_inputs as set_recipe_inputs_t
|
|
70
116
|
from .api.recipes import set_recipe_metadata as set_recipe_metadata_t
|
|
117
|
+
from .api.recipes import set_recipe_output_annotations as set_recipe_output_annotations_t
|
|
118
|
+
from .api.recipes import set_recipe_output_file as set_recipe_output_file_t
|
|
71
119
|
from .api.recipes import set_recipe_outputs as set_recipe_outputs_t
|
|
72
120
|
from .api.recipes import set_recipe_tags as set_recipe_tags_t
|
|
121
|
+
from .api.recipes import set_recipe_total as set_recipe_total_t
|
|
73
122
|
from .api.entity import set_values as set_values_t
|
|
123
|
+
from . import sockets_t as sockets_t
|
|
124
|
+
from . import structured_filters_t as structured_filters_t
|
|
74
125
|
from .api.entity import transition_entity_phase as transition_entity_phase_t
|
|
75
|
-
from . import
|
|
76
|
-
from . import
|
|
77
|
-
from . import
|
|
126
|
+
from .api.recipes import unarchive_recipes as unarchive_recipes_t
|
|
127
|
+
from . import units_t as units_t
|
|
128
|
+
from .api.entity import unlock_entity as unlock_entity_t
|
|
129
|
+
from .api.recipes import unlock_recipes as unlock_recipes_t
|
|
130
|
+
from .api.material_families import update_entity_material_families as update_entity_material_families_t
|
|
131
|
+
from . import uploader_t as uploader_t
|
|
132
|
+
from .api.condition_parameters import upsert_condition_match as upsert_condition_match_t
|
|
133
|
+
from .api.field_options import upsert_field_options as upsert_field_options_t
|
|
134
|
+
from . import users_t as users_t
|
|
135
|
+
from . import webhook_job_t as webhook_job_t
|
|
136
|
+
from . import workflows_t as workflows_t
|
|
78
137
|
|
|
79
138
|
|
|
80
139
|
__all__: list[str] = [
|
|
140
|
+
"add_notebook_content_t",
|
|
141
|
+
"add_recipe_to_project_t",
|
|
142
|
+
"add_time_series_data_t",
|
|
81
143
|
"archive_recipes_t",
|
|
144
|
+
"associate_equipment_input_t",
|
|
82
145
|
"associate_recipe_as_input_t",
|
|
83
146
|
"associate_recipe_as_lot_t",
|
|
84
147
|
"async_batch_t",
|
|
148
|
+
"async_jobs_t",
|
|
149
|
+
"auth_retrieval_t",
|
|
85
150
|
"base_t",
|
|
86
151
|
"calculations_t",
|
|
87
152
|
"chemical_structure_t",
|
|
153
|
+
"clear_recipe_outputs_t",
|
|
154
|
+
"client_config_t",
|
|
155
|
+
"complete_async_parse_t",
|
|
156
|
+
"complete_async_upload_t",
|
|
88
157
|
"convert_chemical_formats_t",
|
|
89
158
|
"create_entities_t",
|
|
90
159
|
"create_entity_t",
|
|
91
160
|
"create_inputs_t",
|
|
161
|
+
"create_mix_order_t",
|
|
162
|
+
"create_or_update_entity_t",
|
|
92
163
|
"create_recipe_t",
|
|
93
164
|
"create_recipe_link_t",
|
|
94
165
|
"create_recipes_t",
|
|
95
166
|
"curves_t",
|
|
167
|
+
"data_t",
|
|
96
168
|
"disassociate_recipe_as_input_t",
|
|
169
|
+
"download_file_t",
|
|
97
170
|
"edit_recipe_inputs_t",
|
|
98
171
|
"entity_t",
|
|
99
172
|
"execute_batch_t",
|
|
100
173
|
"execute_batch_load_async_t",
|
|
101
174
|
"experiment_groups_t",
|
|
175
|
+
"export_entities_t",
|
|
176
|
+
"exports_t",
|
|
177
|
+
"fetch_listing_t",
|
|
102
178
|
"field_values_t",
|
|
103
179
|
"fields_t",
|
|
180
|
+
"generic_upload_t",
|
|
181
|
+
"get_column_calculation_values_t",
|
|
182
|
+
"get_current_user_info_t",
|
|
104
183
|
"get_curve_t",
|
|
105
184
|
"get_entities_data_t",
|
|
106
185
|
"get_input_data_t",
|
|
@@ -109,6 +188,7 @@ __all__: list[str] = [
|
|
|
109
188
|
"get_inputs_data_t",
|
|
110
189
|
"get_output_data_t",
|
|
111
190
|
"get_output_names_t",
|
|
191
|
+
"get_output_organization_t",
|
|
112
192
|
"get_projects_t",
|
|
113
193
|
"get_projects_data_t",
|
|
114
194
|
"get_recipe_calculations_t",
|
|
@@ -117,17 +197,34 @@ __all__: list[str] = [
|
|
|
117
197
|
"get_recipe_names_t",
|
|
118
198
|
"get_recipe_output_metadata_t",
|
|
119
199
|
"get_recipes_data_t",
|
|
200
|
+
"grant_entity_permissions_t",
|
|
120
201
|
"id_source_t",
|
|
121
202
|
"identifier_t",
|
|
122
203
|
"input_attributes_t",
|
|
123
204
|
"inputs_t",
|
|
205
|
+
"integration_server_t",
|
|
206
|
+
"integration_session_t",
|
|
207
|
+
"integrations_t",
|
|
208
|
+
"invoke_uploader_t",
|
|
209
|
+
"job_definition_t",
|
|
210
|
+
"list_aggregate_t",
|
|
124
211
|
"list_entities_t",
|
|
125
212
|
"list_id_source_t",
|
|
213
|
+
"listing_t",
|
|
214
|
+
"lock_entity_t",
|
|
215
|
+
"lock_recipes_t",
|
|
216
|
+
"lookup_entity_t",
|
|
126
217
|
"match_id_source_t",
|
|
218
|
+
"notices_t",
|
|
219
|
+
"notifications_t",
|
|
127
220
|
"outputs_t",
|
|
221
|
+
"overrides_t",
|
|
128
222
|
"permissions_t",
|
|
129
223
|
"phases_t",
|
|
130
224
|
"post_base_t",
|
|
225
|
+
"publish_realtime_data_t",
|
|
226
|
+
"push_notification_t",
|
|
227
|
+
"queued_job_t",
|
|
131
228
|
"recipe_identifiers_t",
|
|
132
229
|
"recipe_inputs_t",
|
|
133
230
|
"recipe_links_t",
|
|
@@ -135,19 +232,41 @@ __all__: list[str] = [
|
|
|
135
232
|
"recipe_output_metadata_t",
|
|
136
233
|
"recipe_tags_t",
|
|
137
234
|
"recipe_workflow_steps_t",
|
|
235
|
+
"recipes_t",
|
|
236
|
+
"register_sockets_token_t",
|
|
237
|
+
"remove_recipe_from_project_t",
|
|
238
|
+
"remove_recipe_link_t",
|
|
138
239
|
"resolve_entity_ids_t",
|
|
139
240
|
"resolve_output_conditions_t",
|
|
140
241
|
"response_t",
|
|
141
242
|
"run_trigger_t",
|
|
243
|
+
"secret_retrieval_t",
|
|
142
244
|
"set_core_permissions_t",
|
|
245
|
+
"set_entity_field_values_t",
|
|
143
246
|
"set_input_attribute_values_t",
|
|
247
|
+
"set_input_category_t",
|
|
248
|
+
"set_input_subcategories_t",
|
|
249
|
+
"set_intermediate_type_t",
|
|
144
250
|
"set_recipe_inputs_t",
|
|
145
251
|
"set_recipe_metadata_t",
|
|
252
|
+
"set_recipe_output_annotations_t",
|
|
253
|
+
"set_recipe_output_file_t",
|
|
146
254
|
"set_recipe_outputs_t",
|
|
147
255
|
"set_recipe_tags_t",
|
|
256
|
+
"set_recipe_total_t",
|
|
148
257
|
"set_values_t",
|
|
258
|
+
"sockets_t",
|
|
259
|
+
"structured_filters_t",
|
|
149
260
|
"transition_entity_phase_t",
|
|
261
|
+
"unarchive_recipes_t",
|
|
150
262
|
"units_t",
|
|
263
|
+
"unlock_entity_t",
|
|
264
|
+
"unlock_recipes_t",
|
|
265
|
+
"update_entity_material_families_t",
|
|
266
|
+
"uploader_t",
|
|
267
|
+
"upsert_condition_match_t",
|
|
268
|
+
"upsert_field_options_t",
|
|
151
269
|
"users_t",
|
|
270
|
+
"webhook_job_t",
|
|
152
271
|
"workflows_t",
|
|
153
272
|
]
|