UncountablePythonSDK 0.0.8__py3-none-any.whl → 0.0.92__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.

Files changed (312) hide show
  1. UncountablePythonSDK-0.0.92.dist-info/METADATA +61 -0
  2. UncountablePythonSDK-0.0.92.dist-info/RECORD +301 -0
  3. {UncountablePythonSDK-0.0.8.dist-info → UncountablePythonSDK-0.0.92.dist-info}/WHEEL +1 -1
  4. {UncountablePythonSDK-0.0.8.dist-info → UncountablePythonSDK-0.0.92.dist-info}/top_level.txt +1 -1
  5. docs/.gitignore +1 -0
  6. docs/conf.py +57 -0
  7. docs/index.md +13 -0
  8. docs/justfile +12 -0
  9. docs/quickstart.md +19 -0
  10. docs/requirements.txt +7 -0
  11. docs/static/favicons/android-chrome-192x192.png +0 -0
  12. docs/static/favicons/android-chrome-512x512.png +0 -0
  13. docs/static/favicons/apple-touch-icon.png +0 -0
  14. docs/static/favicons/browserconfig.xml +9 -0
  15. docs/static/favicons/favicon-16x16.png +0 -0
  16. docs/static/favicons/favicon-32x32.png +0 -0
  17. docs/static/favicons/manifest.json +18 -0
  18. docs/static/favicons/mstile-150x150.png +0 -0
  19. docs/static/favicons/safari-pinned-tab.svg +32 -0
  20. docs/static/logo_blue.png +0 -0
  21. examples/async_batch.py +35 -0
  22. examples/create_entity.py +22 -17
  23. examples/download_files.py +26 -0
  24. examples/edit_recipe_inputs.py +50 -0
  25. examples/integration-server/jobs/materials_auto/example_cron.py +18 -0
  26. examples/integration-server/jobs/materials_auto/example_wh.py +15 -0
  27. examples/integration-server/jobs/materials_auto/profile.yaml +43 -0
  28. examples/integration-server/pyproject.toml +224 -0
  29. examples/invoke_uploader.py +26 -0
  30. examples/set_recipe_metadata_file.py +40 -0
  31. examples/set_recipe_output_file_sdk.py +26 -0
  32. examples/upload_files.py +18 -0
  33. pkgs/argument_parser/__init__.py +5 -0
  34. pkgs/argument_parser/_is_enum.py +1 -6
  35. pkgs/argument_parser/argument_parser.py +232 -76
  36. pkgs/argument_parser/case_convert.py +4 -3
  37. pkgs/filesystem_utils/__init__.py +20 -0
  38. pkgs/filesystem_utils/_blob_session.py +137 -0
  39. pkgs/filesystem_utils/_gdrive_session.py +309 -0
  40. pkgs/filesystem_utils/_local_session.py +69 -0
  41. pkgs/filesystem_utils/_s3_session.py +117 -0
  42. pkgs/filesystem_utils/_sftp_session.py +147 -0
  43. pkgs/filesystem_utils/file_type_utils.py +91 -0
  44. pkgs/filesystem_utils/filesystem_session.py +39 -0
  45. pkgs/py.typed +0 -0
  46. pkgs/serialization/__init__.py +8 -1
  47. pkgs/serialization/annotation.py +64 -0
  48. pkgs/serialization/missing_sentry.py +1 -1
  49. pkgs/serialization/opaque_key.py +1 -1
  50. pkgs/serialization/serial_alias.py +47 -0
  51. pkgs/serialization/serial_class.py +65 -50
  52. pkgs/serialization/serial_generic.py +16 -0
  53. pkgs/serialization/serial_union.py +84 -0
  54. pkgs/serialization/yaml.py +57 -0
  55. pkgs/serialization_util/__init__.py +7 -7
  56. pkgs/serialization_util/_get_type_for_serialization.py +1 -3
  57. pkgs/serialization_util/convert_to_snakecase.py +27 -0
  58. pkgs/serialization_util/dataclasses.py +14 -0
  59. pkgs/serialization_util/serialization_helpers.py +116 -74
  60. pkgs/strenum_compat/strenum_compat.py +1 -9
  61. pkgs/type_spec/actions_registry/__init__.py +0 -0
  62. pkgs/type_spec/actions_registry/__main__.py +126 -0
  63. pkgs/type_spec/actions_registry/emit_typescript.py +182 -0
  64. pkgs/type_spec/builder.py +475 -89
  65. pkgs/type_spec/config.py +24 -19
  66. pkgs/type_spec/emit_io_ts.py +5 -2
  67. pkgs/type_spec/emit_open_api.py +266 -32
  68. pkgs/type_spec/emit_open_api_util.py +32 -13
  69. pkgs/type_spec/emit_python.py +599 -151
  70. pkgs/type_spec/emit_typescript.py +74 -273
  71. pkgs/type_spec/emit_typescript_util.py +239 -5
  72. pkgs/type_spec/load_types.py +55 -10
  73. pkgs/type_spec/open_api_util.py +30 -41
  74. pkgs/type_spec/parts/base.py.prepart +4 -3
  75. pkgs/type_spec/type_info/emit_type_info.py +178 -16
  76. pkgs/type_spec/util.py +11 -11
  77. pkgs/type_spec/value_spec/__main__.py +3 -3
  78. pkgs/type_spec/value_spec/convert_type.py +8 -1
  79. pkgs/type_spec/value_spec/emit_python.py +13 -4
  80. uncountable/__init__.py +1 -2
  81. uncountable/core/__init__.py +12 -2
  82. uncountable/core/async_batch.py +37 -0
  83. uncountable/core/client.py +293 -43
  84. uncountable/core/environment.py +41 -0
  85. uncountable/core/file_upload.py +135 -0
  86. uncountable/core/types.py +17 -0
  87. uncountable/integration/__init__.py +0 -0
  88. uncountable/integration/cli.py +49 -0
  89. uncountable/integration/construct_client.py +51 -0
  90. uncountable/integration/cron.py +29 -0
  91. uncountable/integration/db/__init__.py +0 -0
  92. uncountable/integration/db/connect.py +18 -0
  93. uncountable/integration/db/session.py +25 -0
  94. uncountable/integration/entrypoint.py +13 -0
  95. uncountable/integration/executors/__init__.py +0 -0
  96. uncountable/integration/executors/executors.py +148 -0
  97. uncountable/integration/executors/generic_upload_executor.py +284 -0
  98. uncountable/integration/executors/script_executor.py +25 -0
  99. uncountable/integration/job.py +87 -0
  100. uncountable/integration/queue_runner/__init__.py +0 -0
  101. uncountable/integration/queue_runner/command_server/__init__.py +24 -0
  102. uncountable/integration/queue_runner/command_server/command_client.py +68 -0
  103. uncountable/integration/queue_runner/command_server/command_server.py +64 -0
  104. uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  105. uncountable/integration/queue_runner/command_server/protocol/command_server.proto +22 -0
  106. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +40 -0
  107. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +38 -0
  108. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +129 -0
  109. uncountable/integration/queue_runner/command_server/types.py +52 -0
  110. uncountable/integration/queue_runner/datastore/__init__.py +3 -0
  111. uncountable/integration/queue_runner/datastore/datastore_sqlite.py +93 -0
  112. uncountable/integration/queue_runner/datastore/interface.py +19 -0
  113. uncountable/integration/queue_runner/datastore/model.py +17 -0
  114. uncountable/integration/queue_runner/job_scheduler.py +163 -0
  115. uncountable/integration/queue_runner/queue_runner.py +26 -0
  116. uncountable/integration/queue_runner/types.py +7 -0
  117. uncountable/integration/queue_runner/worker.py +119 -0
  118. uncountable/integration/scan_profiles.py +67 -0
  119. uncountable/integration/scheduler.py +150 -0
  120. uncountable/integration/secret_retrieval/__init__.py +3 -0
  121. uncountable/integration/secret_retrieval/retrieve_secret.py +93 -0
  122. uncountable/integration/server.py +117 -0
  123. uncountable/integration/telemetry.py +209 -0
  124. uncountable/integration/webhook_server/entrypoint.py +170 -0
  125. uncountable/types/__init__.py +136 -20
  126. uncountable/types/api/batch/execute_batch.py +15 -7
  127. uncountable/types/api/batch/execute_batch_load_async.py +42 -0
  128. uncountable/types/api/chemical/__init__.py +1 -0
  129. uncountable/types/api/chemical/convert_chemical_formats.py +63 -0
  130. uncountable/types/api/entity/create_entities.py +23 -11
  131. uncountable/types/api/entity/create_entity.py +21 -12
  132. uncountable/types/api/entity/get_entities_data.py +18 -8
  133. uncountable/types/api/entity/grant_entity_permissions.py +48 -0
  134. uncountable/types/api/entity/list_entities.py +27 -12
  135. uncountable/types/api/entity/lock_entity.py +45 -0
  136. uncountable/types/api/entity/resolve_entity_ids.py +17 -7
  137. uncountable/types/api/entity/set_entity_field_values.py +44 -0
  138. uncountable/types/api/entity/set_values.py +14 -7
  139. uncountable/types/api/entity/transition_entity_phase.py +80 -0
  140. uncountable/types/api/entity/unlock_entity.py +44 -0
  141. uncountable/types/api/equipment/__init__.py +1 -0
  142. uncountable/types/api/equipment/associate_equipment_input.py +44 -0
  143. uncountable/types/api/field_options/__init__.py +1 -0
  144. uncountable/types/api/field_options/upsert_field_options.py +55 -0
  145. uncountable/types/api/files/__init__.py +1 -0
  146. uncountable/types/api/files/download_file.py +77 -0
  147. uncountable/types/api/id_source/__init__.py +1 -0
  148. uncountable/types/api/id_source/list_id_source.py +56 -0
  149. uncountable/types/api/id_source/match_id_source.py +54 -0
  150. uncountable/types/api/input_groups/get_input_group_names.py +16 -6
  151. uncountable/types/api/inputs/create_inputs.py +24 -11
  152. uncountable/types/api/inputs/get_input_data.py +32 -13
  153. uncountable/types/api/inputs/get_input_names.py +18 -8
  154. uncountable/types/api/inputs/get_inputs_data.py +29 -10
  155. uncountable/types/api/inputs/set_input_attribute_values.py +16 -9
  156. uncountable/types/api/inputs/set_input_category.py +44 -0
  157. uncountable/types/api/inputs/set_input_subcategories.py +45 -0
  158. uncountable/types/api/inputs/set_intermediate_type.py +50 -0
  159. uncountable/types/api/material_families/__init__.py +1 -0
  160. uncountable/types/api/material_families/update_entity_material_families.py +48 -0
  161. uncountable/types/api/outputs/get_output_data.py +32 -16
  162. uncountable/types/api/outputs/get_output_names.py +18 -8
  163. uncountable/types/api/outputs/resolve_output_conditions.py +23 -10
  164. uncountable/types/api/permissions/__init__.py +1 -0
  165. uncountable/types/api/permissions/set_core_permissions.py +105 -0
  166. uncountable/types/api/project/get_projects.py +17 -7
  167. uncountable/types/api/project/get_projects_data.py +21 -11
  168. uncountable/types/api/recipe_links/__init__.py +1 -0
  169. uncountable/types/api/recipe_links/create_recipe_link.py +46 -0
  170. uncountable/types/api/recipe_links/remove_recipe_link.py +45 -0
  171. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +18 -8
  172. uncountable/types/api/recipes/add_recipe_to_project.py +42 -0
  173. uncountable/types/api/recipes/archive_recipes.py +42 -0
  174. uncountable/types/api/recipes/associate_recipe_as_input.py +44 -0
  175. uncountable/types/api/recipes/associate_recipe_as_lot.py +43 -0
  176. uncountable/types/api/recipes/clear_recipe_outputs.py +42 -0
  177. uncountable/types/api/recipes/create_recipe.py +51 -0
  178. uncountable/types/api/recipes/create_recipes.py +25 -12
  179. uncountable/types/api/recipes/disassociate_recipe_as_input.py +42 -0
  180. uncountable/types/api/recipes/edit_recipe_inputs.py +283 -0
  181. uncountable/types/api/recipes/get_column_calculation_values.py +58 -0
  182. uncountable/types/api/recipes/get_curve.py +15 -7
  183. uncountable/types/api/recipes/get_recipe_calculations.py +17 -10
  184. uncountable/types/api/recipes/get_recipe_links.py +13 -6
  185. uncountable/types/api/recipes/get_recipe_names.py +16 -6
  186. uncountable/types/api/recipes/get_recipe_output_metadata.py +14 -7
  187. uncountable/types/api/recipes/get_recipes_data.py +63 -38
  188. uncountable/types/api/recipes/lock_recipes.py +63 -0
  189. uncountable/types/api/recipes/remove_recipe_from_project.py +42 -0
  190. uncountable/types/api/recipes/set_recipe_inputs.py +19 -10
  191. uncountable/types/api/recipes/set_recipe_metadata.py +43 -0
  192. uncountable/types/api/recipes/set_recipe_output_annotations.py +115 -0
  193. uncountable/types/api/recipes/set_recipe_output_file.py +56 -0
  194. uncountable/types/api/recipes/set_recipe_outputs.py +26 -12
  195. uncountable/types/api/recipes/set_recipe_tags.py +109 -0
  196. uncountable/types/api/recipes/unarchive_recipes.py +41 -0
  197. uncountable/types/api/recipes/unlock_recipes.py +50 -0
  198. uncountable/types/api/triggers/__init__.py +1 -0
  199. uncountable/types/api/triggers/run_trigger.py +43 -0
  200. uncountable/types/api/uploader/__init__.py +1 -0
  201. uncountable/types/api/uploader/invoke_uploader.py +47 -0
  202. uncountable/types/async_batch.py +13 -0
  203. uncountable/types/async_batch_processor.py +384 -0
  204. uncountable/types/async_batch_t.py +97 -0
  205. uncountable/types/async_jobs.py +9 -0
  206. uncountable/types/async_jobs_t.py +53 -0
  207. uncountable/types/auth_retrieval.py +12 -0
  208. uncountable/types/auth_retrieval_t.py +75 -0
  209. uncountable/types/base.py +5 -78
  210. uncountable/types/base_t.py +85 -0
  211. uncountable/types/calculations.py +3 -18
  212. uncountable/types/calculations_t.py +27 -0
  213. uncountable/types/chemical_structure.py +8 -0
  214. uncountable/types/chemical_structure_t.py +28 -0
  215. uncountable/types/client_base.py +1093 -54
  216. uncountable/types/client_config.py +8 -0
  217. uncountable/types/client_config_t.py +26 -0
  218. uncountable/types/curves.py +5 -42
  219. uncountable/types/curves_t.py +51 -0
  220. uncountable/types/entity.py +8 -269
  221. uncountable/types/entity_t.py +393 -0
  222. uncountable/types/experiment_groups.py +3 -18
  223. uncountable/types/experiment_groups_t.py +27 -0
  224. uncountable/types/field_values.py +17 -60
  225. uncountable/types/field_values_t.py +204 -0
  226. uncountable/types/fields.py +3 -19
  227. uncountable/types/fields_t.py +28 -0
  228. uncountable/types/generic_upload.py +15 -0
  229. uncountable/types/generic_upload_t.py +119 -0
  230. uncountable/types/id_source.py +12 -0
  231. uncountable/types/id_source_t.py +68 -0
  232. uncountable/types/identifier.py +11 -0
  233. uncountable/types/identifier_t.py +63 -0
  234. uncountable/types/input_attributes.py +3 -24
  235. uncountable/types/input_attributes_t.py +30 -0
  236. uncountable/types/inputs.py +6 -56
  237. uncountable/types/inputs_t.py +83 -0
  238. uncountable/types/integration_server.py +9 -0
  239. uncountable/types/integration_server_t.py +42 -0
  240. uncountable/types/job_definition.py +27 -0
  241. uncountable/types/job_definition_t.py +260 -0
  242. uncountable/types/outputs.py +3 -21
  243. uncountable/types/outputs_t.py +30 -0
  244. uncountable/types/overrides.py +10 -0
  245. uncountable/types/overrides_t.py +49 -0
  246. uncountable/types/permissions.py +8 -0
  247. uncountable/types/permissions_t.py +46 -0
  248. uncountable/types/phases.py +3 -18
  249. uncountable/types/phases_t.py +27 -0
  250. uncountable/types/post_base.py +8 -0
  251. uncountable/types/post_base_t.py +30 -0
  252. uncountable/types/queued_job.py +16 -0
  253. uncountable/types/queued_job_t.py +123 -0
  254. uncountable/types/recipe_identifiers.py +12 -0
  255. uncountable/types/recipe_identifiers_t.py +76 -0
  256. uncountable/types/recipe_inputs.py +9 -0
  257. uncountable/types/recipe_inputs_t.py +30 -0
  258. uncountable/types/recipe_links.py +4 -45
  259. uncountable/types/recipe_links_t.py +54 -0
  260. uncountable/types/recipe_metadata.py +5 -45
  261. uncountable/types/recipe_metadata_t.py +58 -0
  262. uncountable/types/recipe_output_metadata.py +3 -19
  263. uncountable/types/recipe_output_metadata_t.py +28 -0
  264. uncountable/types/recipe_tags.py +3 -18
  265. uncountable/types/recipe_tags_t.py +27 -0
  266. uncountable/types/recipe_workflow_steps.py +14 -0
  267. uncountable/types/recipe_workflow_steps_t.py +95 -0
  268. uncountable/types/recipes.py +8 -0
  269. uncountable/types/recipes_t.py +25 -0
  270. uncountable/types/response.py +3 -20
  271. uncountable/types/response_t.py +26 -0
  272. uncountable/types/secret_retrieval.py +12 -0
  273. uncountable/types/secret_retrieval_t.py +75 -0
  274. uncountable/types/units.py +3 -18
  275. uncountable/types/units_t.py +27 -0
  276. uncountable/types/users.py +3 -19
  277. uncountable/types/users_t.py +28 -0
  278. uncountable/types/webhook_job.py +9 -0
  279. uncountable/types/webhook_job_t.py +37 -0
  280. uncountable/types/workflows.py +4 -27
  281. uncountable/types/workflows_t.py +39 -0
  282. UncountablePythonSDK-0.0.8.dist-info/METADATA +0 -27
  283. UncountablePythonSDK-0.0.8.dist-info/RECORD +0 -134
  284. examples/recipe-import/importer.py +0 -39
  285. type_spec/external/api/batch/execute_batch.yaml +0 -56
  286. type_spec/external/api/entity/create_entities.yaml +0 -33
  287. type_spec/external/api/entity/create_entity.yaml +0 -39
  288. type_spec/external/api/entity/get_entities_data.yaml +0 -29
  289. type_spec/external/api/entity/list_entities.yaml +0 -52
  290. type_spec/external/api/entity/resolve_entity_ids.yaml +0 -29
  291. type_spec/external/api/entity/set_values.yaml +0 -18
  292. type_spec/external/api/input_groups/get_input_group_names.yaml +0 -29
  293. type_spec/external/api/inputs/create_inputs.yaml +0 -48
  294. type_spec/external/api/inputs/get_input_data.yaml +0 -95
  295. type_spec/external/api/inputs/get_input_names.yaml +0 -38
  296. type_spec/external/api/inputs/get_inputs_data.yaml +0 -82
  297. type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -33
  298. type_spec/external/api/outputs/get_output_data.yaml +0 -92
  299. type_spec/external/api/outputs/get_output_names.yaml +0 -35
  300. type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -50
  301. type_spec/external/api/project/get_projects.yaml +0 -42
  302. type_spec/external/api/project/get_projects_data.yaml +0 -50
  303. type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -41
  304. type_spec/external/api/recipes/create_recipes.yaml +0 -47
  305. type_spec/external/api/recipes/get_curve.yaml +0 -18
  306. type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -39
  307. type_spec/external/api/recipes/get_recipe_links.yaml +0 -26
  308. type_spec/external/api/recipes/get_recipe_names.yaml +0 -29
  309. type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -36
  310. type_spec/external/api/recipes/get_recipes_data.yaml +0 -238
  311. type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -36
  312. type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -52
@@ -0,0 +1,384 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402 Q003
4
+ # fmt: off
5
+ # isort: skip_file
6
+ # ruff: noqa: PLR0904
7
+ from __future__ import annotations
8
+ import typing # noqa: F401
9
+ import datetime # noqa: F401
10
+ from decimal import Decimal # noqa: F401
11
+ import uncountable.types.api.equipment.associate_equipment_input as associate_equipment_input_t
12
+ import uncountable.types.api.recipes.associate_recipe_as_input as associate_recipe_as_input_t
13
+ from uncountable.types import async_batch_t
14
+ from uncountable.types import base_t
15
+ import uncountable.types.api.recipes.clear_recipe_outputs as clear_recipe_outputs_t
16
+ import uncountable.types.api.recipes.create_recipe as create_recipe_t
17
+ import uncountable.types.api.recipes.edit_recipe_inputs as edit_recipe_inputs_t
18
+ from uncountable.types import entity_t
19
+ from uncountable.types import field_values_t
20
+ from uncountable.types import generic_upload_t
21
+ import uncountable.types.api.entity.grant_entity_permissions as grant_entity_permissions_t
22
+ from uncountable.types import identifier_t
23
+ import uncountable.types.api.uploader.invoke_uploader as invoke_uploader_t
24
+ from uncountable.types import recipe_identifiers_t
25
+ from uncountable.types import recipe_metadata_t
26
+ from uncountable.types import recipe_workflow_steps_t
27
+ import uncountable.types.api.entity.set_entity_field_values as set_entity_field_values_t
28
+ import uncountable.types.api.recipes.set_recipe_metadata as set_recipe_metadata_t
29
+ import uuid
30
+ from abc import ABC, abstractmethod
31
+ from pkgs.serialization_util import serialize_for_api
32
+
33
+
34
+ class AsyncBatchProcessorBase(ABC):
35
+ @abstractmethod
36
+ def _enqueue(self, req: async_batch_t.AsyncBatchRequest) -> None:
37
+ ...
38
+
39
+ @abstractmethod
40
+ def send(self) -> base_t.ObjectId:
41
+ ...
42
+
43
+ def associate_equipment_input(
44
+ self,
45
+ *,
46
+ equipment_key: identifier_t.IdentifierKey,
47
+ material_family_ids: list[base_t.ObjectId],
48
+ depends_on: list[str] | None = None,
49
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
50
+ """Create or return the input association for equipment
51
+
52
+ :param equipment_key: Identifier of the equipment to associate
53
+ :param material_family_ids: The list of material families to add the input to. This must be non-empty
54
+ :param depends_on: A list of batch reference keys to process before processing this request
55
+ """
56
+ args = associate_equipment_input_t.Arguments(
57
+ equipment_key=equipment_key,
58
+ material_family_ids=material_family_ids,
59
+ )
60
+ json_data = serialize_for_api(args)
61
+
62
+ batch_reference = str(uuid.uuid4())
63
+
64
+ req = async_batch_t.AsyncBatchRequest(
65
+ path=async_batch_t.AsyncBatchRequestPath.ASSOCIATE_EQUIPMENT_INPUT,
66
+ data=json_data,
67
+ depends_on=depends_on,
68
+ batch_reference=batch_reference,
69
+ )
70
+
71
+ self._enqueue(req)
72
+
73
+ return async_batch_t.QueuedAsyncBatchRequest(
74
+ path=req.path,
75
+ batch_reference=req.batch_reference,
76
+ )
77
+
78
+ def associate_recipe_as_input(
79
+ self,
80
+ *,
81
+ recipe_key: identifier_t.IdentifierKey,
82
+ input_key: identifier_t.IdentifierKey | None = None,
83
+ show_in_listings: bool | None = None,
84
+ depends_on: list[str] | None = None,
85
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
86
+ """Create or return the input association for a recipe
87
+
88
+ :param recipe_key: Identifier for the recipe
89
+ :param input_key: Identifier for an input to use for the association. Optionally supplied. If not supplied, one is created
90
+ :param show_in_listings: After associating the input should it be present in listings
91
+ :param depends_on: A list of batch reference keys to process before processing this request
92
+ """
93
+ args = associate_recipe_as_input_t.Arguments(
94
+ recipe_key=recipe_key,
95
+ input_key=input_key,
96
+ show_in_listings=show_in_listings,
97
+ )
98
+ json_data = serialize_for_api(args)
99
+
100
+ batch_reference = str(uuid.uuid4())
101
+
102
+ req = async_batch_t.AsyncBatchRequest(
103
+ path=async_batch_t.AsyncBatchRequestPath.ASSOCIATE_RECIPE_AS_INPUT,
104
+ data=json_data,
105
+ depends_on=depends_on,
106
+ batch_reference=batch_reference,
107
+ )
108
+
109
+ self._enqueue(req)
110
+
111
+ return async_batch_t.QueuedAsyncBatchRequest(
112
+ path=req.path,
113
+ batch_reference=req.batch_reference,
114
+ )
115
+
116
+ def clear_recipe_outputs(
117
+ self,
118
+ *,
119
+ recipe_key: identifier_t.IdentifierKey,
120
+ depends_on: list[str] | None = None,
121
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
122
+ """Clears all output values & output metadata for a given recipe
123
+
124
+ :param recipe_key: The identifier of the recipe
125
+ :param depends_on: A list of batch reference keys to process before processing this request
126
+ """
127
+ args = clear_recipe_outputs_t.Arguments(
128
+ recipe_key=recipe_key,
129
+ )
130
+ json_data = serialize_for_api(args)
131
+
132
+ batch_reference = str(uuid.uuid4())
133
+
134
+ req = async_batch_t.AsyncBatchRequest(
135
+ path=async_batch_t.AsyncBatchRequestPath.CLEAR_RECIPE_OUTPUTS,
136
+ data=json_data,
137
+ depends_on=depends_on,
138
+ batch_reference=batch_reference,
139
+ )
140
+
141
+ self._enqueue(req)
142
+
143
+ return async_batch_t.QueuedAsyncBatchRequest(
144
+ path=req.path,
145
+ batch_reference=req.batch_reference,
146
+ )
147
+
148
+ def create_recipe(
149
+ self,
150
+ *,
151
+ material_family_id: base_t.ObjectId,
152
+ workflow_id: base_t.ObjectId,
153
+ name: str | None = None,
154
+ project_id: base_t.ObjectId | None = None,
155
+ workflow_variant_id: typing.Optional[base_t.ObjectId] | None = None,
156
+ recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None,
157
+ identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None,
158
+ definition_key: identifier_t.IdentifierKey | None = None,
159
+ depends_on: list[str] | None = None,
160
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
161
+ """Returns the id of the recipe being created.
162
+
163
+ :param name: The name for the recipe
164
+ :param material_family_id: The material family for the recipe
165
+ :param project_id: The identifier of the project to create the recipe in
166
+ :param workflow_id: The identifier of the workflow to create the recipe with
167
+ :param workflow_variant_id: The identifier of the workflow variant to create the recipe with
168
+ :param recipe_metadata: Metadata values to populate the recipe with
169
+ :param identifiers: A recipe won't be created if it matches the identifier. An identifier must be unique in the schema
170
+ :param definition_key: The entity definition identifier, default is used if not supplied
171
+ :param depends_on: A list of batch reference keys to process before processing this request
172
+ """
173
+ args = create_recipe_t.Arguments(
174
+ name=name,
175
+ material_family_id=material_family_id,
176
+ project_id=project_id,
177
+ workflow_id=workflow_id,
178
+ workflow_variant_id=workflow_variant_id,
179
+ recipe_metadata=recipe_metadata,
180
+ identifiers=identifiers,
181
+ definition_key=definition_key,
182
+ )
183
+ json_data = serialize_for_api(args)
184
+
185
+ batch_reference = str(uuid.uuid4())
186
+
187
+ req = async_batch_t.AsyncBatchRequest(
188
+ path=async_batch_t.AsyncBatchRequestPath.CREATE_RECIPE,
189
+ data=json_data,
190
+ depends_on=depends_on,
191
+ batch_reference=batch_reference,
192
+ )
193
+
194
+ self._enqueue(req)
195
+
196
+ return async_batch_t.QueuedAsyncBatchRequest(
197
+ path=req.path,
198
+ batch_reference=req.batch_reference,
199
+ )
200
+
201
+ def edit_recipe_inputs(
202
+ self,
203
+ *,
204
+ recipe_key: identifier_t.IdentifierKey,
205
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier,
206
+ edits: list[edit_recipe_inputs_t.RecipeInputEdit],
207
+ depends_on: list[str] | None = None,
208
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
209
+ """Clear, update, or add inputs on a recipe
210
+
211
+ :param recipe_key: Identifier for the recipe
212
+ :param depends_on: A list of batch reference keys to process before processing this request
213
+ """
214
+ args = edit_recipe_inputs_t.Arguments(
215
+ recipe_key=recipe_key,
216
+ recipe_workflow_step_identifier=recipe_workflow_step_identifier,
217
+ edits=edits,
218
+ )
219
+ json_data = serialize_for_api(args)
220
+
221
+ batch_reference = str(uuid.uuid4())
222
+
223
+ req = async_batch_t.AsyncBatchRequest(
224
+ path=async_batch_t.AsyncBatchRequestPath.EDIT_RECIPE_INPUTS,
225
+ data=json_data,
226
+ depends_on=depends_on,
227
+ batch_reference=batch_reference,
228
+ )
229
+
230
+ self._enqueue(req)
231
+
232
+ return async_batch_t.QueuedAsyncBatchRequest(
233
+ path=req.path,
234
+ batch_reference=req.batch_reference,
235
+ )
236
+
237
+ def grant_entity_permissions(
238
+ self,
239
+ *,
240
+ entity_type: entity_t.LimitedEntityType,
241
+ entity_key: identifier_t.IdentifierKey,
242
+ permission_types: list[entity_t.GrantableEntityPermissionType],
243
+ user_keys: list[identifier_t.IdentifierKey] | None = None,
244
+ user_group_keys: list[identifier_t.IdentifierKey] | None = None,
245
+ all_users: bool | None = None,
246
+ depends_on: list[str] | None = None,
247
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
248
+ """Grant entity permissions to a list of users or user groups or to all users.
249
+
250
+ :param depends_on: A list of batch reference keys to process before processing this request
251
+ """
252
+ args = grant_entity_permissions_t.Arguments(
253
+ entity_type=entity_type,
254
+ entity_key=entity_key,
255
+ permission_types=permission_types,
256
+ user_keys=user_keys,
257
+ user_group_keys=user_group_keys,
258
+ all_users=all_users,
259
+ )
260
+ json_data = serialize_for_api(args)
261
+
262
+ batch_reference = str(uuid.uuid4())
263
+
264
+ req = async_batch_t.AsyncBatchRequest(
265
+ path=async_batch_t.AsyncBatchRequestPath.GRANT_ENTITY_PERMISSIONS,
266
+ data=json_data,
267
+ depends_on=depends_on,
268
+ batch_reference=batch_reference,
269
+ )
270
+
271
+ self._enqueue(req)
272
+
273
+ return async_batch_t.QueuedAsyncBatchRequest(
274
+ path=req.path,
275
+ batch_reference=req.batch_reference,
276
+ )
277
+
278
+ def invoke_uploader(
279
+ self,
280
+ *,
281
+ uploader_key: identifier_t.IdentifierKey,
282
+ destination: generic_upload_t.UploadDestination,
283
+ file_id: base_t.ObjectId | None = None,
284
+ file_ids: list[base_t.ObjectId] | None = None,
285
+ depends_on: list[str] | None = None,
286
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
287
+ """Runs a file through an uploader.
288
+
289
+ :param file_id: DEPRECATED: use file_ids
290
+ :param depends_on: A list of batch reference keys to process before processing this request
291
+ """
292
+ args = invoke_uploader_t.Arguments(
293
+ file_id=file_id,
294
+ file_ids=file_ids,
295
+ uploader_key=uploader_key,
296
+ destination=destination,
297
+ )
298
+ json_data = serialize_for_api(args)
299
+
300
+ batch_reference = str(uuid.uuid4())
301
+
302
+ req = async_batch_t.AsyncBatchRequest(
303
+ path=async_batch_t.AsyncBatchRequestPath.INVOKE_UPLOADER,
304
+ data=json_data,
305
+ depends_on=depends_on,
306
+ batch_reference=batch_reference,
307
+ )
308
+
309
+ self._enqueue(req)
310
+
311
+ return async_batch_t.QueuedAsyncBatchRequest(
312
+ path=req.path,
313
+ batch_reference=req.batch_reference,
314
+ )
315
+
316
+ def set_entity_field_values(
317
+ self,
318
+ *,
319
+ entity_identifier: entity_t.EntityIdentifier,
320
+ field_values: list[field_values_t.FieldArgumentValue],
321
+ depends_on: list[str] | None = None,
322
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
323
+ """Sets field values for an entity
324
+
325
+ :param entity_identifier: Entity to update
326
+ :param field_values: Field values to set
327
+ :param depends_on: A list of batch reference keys to process before processing this request
328
+ """
329
+ args = set_entity_field_values_t.Arguments(
330
+ entity_identifier=entity_identifier,
331
+ field_values=field_values,
332
+ )
333
+ json_data = serialize_for_api(args)
334
+
335
+ batch_reference = str(uuid.uuid4())
336
+
337
+ req = async_batch_t.AsyncBatchRequest(
338
+ path=async_batch_t.AsyncBatchRequestPath.SET_ENTITY_FIELD_VALUES,
339
+ data=json_data,
340
+ depends_on=depends_on,
341
+ batch_reference=batch_reference,
342
+ )
343
+
344
+ self._enqueue(req)
345
+
346
+ return async_batch_t.QueuedAsyncBatchRequest(
347
+ path=req.path,
348
+ batch_reference=req.batch_reference,
349
+ )
350
+
351
+ def set_recipe_metadata(
352
+ self,
353
+ *,
354
+ recipe_key: identifier_t.IdentifierKey,
355
+ recipe_metadata: list[recipe_metadata_t.MetadataValue],
356
+ depends_on: list[str] | None = None,
357
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
358
+ """Set metadata values on a recipe
359
+
360
+ :param recipe_key: Identifier for the recipe
361
+ :param recipe_metadata: Metadata values to populate the recipe with
362
+ :param depends_on: A list of batch reference keys to process before processing this request
363
+ """
364
+ args = set_recipe_metadata_t.Arguments(
365
+ recipe_key=recipe_key,
366
+ recipe_metadata=recipe_metadata,
367
+ )
368
+ json_data = serialize_for_api(args)
369
+
370
+ batch_reference = str(uuid.uuid4())
371
+
372
+ req = async_batch_t.AsyncBatchRequest(
373
+ path=async_batch_t.AsyncBatchRequestPath.SET_RECIPE_METADATA,
374
+ data=json_data,
375
+ depends_on=depends_on,
376
+ batch_reference=batch_reference,
377
+ )
378
+
379
+ self._enqueue(req)
380
+
381
+ return async_batch_t.QueuedAsyncBatchRequest(
382
+ path=req.path,
383
+ batch_reference=req.batch_reference,
384
+ )
@@ -0,0 +1,97 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402 Q003
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ from pkgs.strenum_compat import StrEnum
11
+ import dataclasses
12
+ from pkgs.serialization import serial_class
13
+ from . import base_t
14
+ from . import entity_t
15
+
16
+ __all__: list[str] = [
17
+ "AsyncBatchActionReturn",
18
+ "AsyncBatchRequest",
19
+ "AsyncBatchRequestPath",
20
+ "AsyncBatchResultValue",
21
+ "QueuedAsyncBatchRequest",
22
+ "SavedAsyncBatchActionReturn",
23
+ ]
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ class AsyncBatchRequestPath(StrEnum):
28
+ CREATE_RECIPE = "recipes/create_recipe"
29
+ SET_RECIPE_METADATA = "recipes/set_recipe_metadata"
30
+ SET_RECIPE_TAGS = "recipes/set_recipe_tags"
31
+ EDIT_RECIPE_INPUTS = "recipes/edit_recipe_inputs"
32
+ ARCHIVE_RECIPES = "recipes/archive"
33
+ LOCK_RECIPES = "recipes/lock_recipes"
34
+ UNLOCK_RECIPES = "recipes/unlock_recipes"
35
+ ASSOCIATE_EQUIPMENT_INPUT = "equipment/associate_equipment_input"
36
+ INVOKE_UPLOADER = "uploader/invoke_uploader"
37
+ ASSOCIATE_RECIPE_AS_INPUT = "recipes/associate_recipe_as_input"
38
+ CLEAR_RECIPE_OUTPUTS = "recipes/clear_recipe_outputs"
39
+ GRANT_ENTITY_PERMISSIONS = "entity/grant_entity_permissions"
40
+ SET_ENTITY_FIELD_VALUES = "entity/set_entity_field_values"
41
+
42
+
43
+ # DO NOT MODIFY -- This file is generated by type_spec
44
+ @serial_class(
45
+ named_type_path="sdk.async_batch.AsyncBatchRequest",
46
+ unconverted_values={"data"},
47
+ )
48
+ @dataclasses.dataclass(kw_only=True)
49
+ class AsyncBatchRequest:
50
+ path: AsyncBatchRequestPath
51
+ data: base_t.JsonValue
52
+ batch_reference: str
53
+ depends_on: list[str] | None = None
54
+
55
+
56
+ # DO NOT MODIFY -- This file is generated by type_spec
57
+ @serial_class(
58
+ named_type_path="sdk.async_batch.AsyncBatchResultValue",
59
+ unconverted_values={"value"},
60
+ )
61
+ @dataclasses.dataclass(kw_only=True)
62
+ class AsyncBatchResultValue:
63
+ data_key: str
64
+ value: base_t.JsonValue
65
+
66
+
67
+ # DO NOT MODIFY -- This file is generated by type_spec
68
+ @serial_class(
69
+ named_type_path="sdk.async_batch.AsyncBatchActionReturn",
70
+ )
71
+ @dataclasses.dataclass(kw_only=True)
72
+ class AsyncBatchActionReturn:
73
+ modification_made: bool
74
+ result_id: base_t.ObjectId | None = None
75
+ entity: entity_t.Entity | None = None
76
+ result_values: list[AsyncBatchResultValue] | None = None
77
+
78
+
79
+ # DO NOT MODIFY -- This file is generated by type_spec
80
+ @serial_class(
81
+ named_type_path="sdk.async_batch.SavedAsyncBatchActionReturn",
82
+ )
83
+ @dataclasses.dataclass(kw_only=True)
84
+ class SavedAsyncBatchActionReturn:
85
+ identifier: str
86
+ result_data: AsyncBatchActionReturn
87
+
88
+
89
+ # DO NOT MODIFY -- This file is generated by type_spec
90
+ @serial_class(
91
+ named_type_path="sdk.async_batch.QueuedAsyncBatchRequest",
92
+ )
93
+ @dataclasses.dataclass(kw_only=True, frozen=True, eq=True)
94
+ class QueuedAsyncBatchRequest:
95
+ path: AsyncBatchRequestPath
96
+ batch_reference: str
97
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,9 @@
1
+ # flake8: noqa: F821
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ # DO NOT MODIFY -- This file is generated by type_spec
6
+ # Kept only for SDK backwards compatibility
7
+ from .async_jobs_t import AsyncJobType as AsyncJobType
8
+ from .async_jobs_t import AsyncJobStatus as AsyncJobStatus
9
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,53 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402 Q003
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ from pkgs.strenum_compat import StrEnum
11
+ from pkgs.serialization import serial_string_enum
12
+
13
+ __all__: list[str] = [
14
+ "ASYNC_JOB_STATUS_FIELD_REF_NAME",
15
+ "ASYNC_JOB_TYPE_FIELD_REF_NAME",
16
+ "AsyncJobStatus",
17
+ "AsyncJobType",
18
+ ]
19
+
20
+
21
+ # DO NOT MODIFY -- This file is generated by type_spec
22
+ @serial_string_enum(
23
+ labels={
24
+ "async_batch_load": "Async Batch Load",
25
+ "integration_server_run": "Integration Server Run",
26
+ },
27
+ )
28
+ class AsyncJobType(StrEnum):
29
+ ASYNC_BATCH_LOAD = "async_batch_load"
30
+ INTEGRATION_SERVER_RUN = "integration_server_run"
31
+
32
+
33
+ # DO NOT MODIFY -- This file is generated by type_spec
34
+ @serial_string_enum(
35
+ labels={
36
+ "in_progress": "In Progress",
37
+ "completed": "Completed",
38
+ "error": "Error",
39
+ },
40
+ )
41
+ class AsyncJobStatus(StrEnum):
42
+ IN_PROGRESS = "in_progress"
43
+ COMPLETED = "completed"
44
+ ERROR = "error"
45
+
46
+
47
+ # DO NOT MODIFY -- This file is generated by type_spec
48
+ ASYNC_JOB_TYPE_FIELD_REF_NAME = "core_async_job_jobType"
49
+
50
+
51
+ # DO NOT MODIFY -- This file is generated by type_spec
52
+ ASYNC_JOB_STATUS_FIELD_REF_NAME = "core_async_job_status"
53
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,12 @@
1
+ # flake8: noqa: F821
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ # DO NOT MODIFY -- This file is generated by type_spec
6
+ # Kept only for SDK backwards compatibility
7
+ from .auth_retrieval_t import AuthRetrievalType as AuthRetrievalType
8
+ from .auth_retrieval_t import AuthRetrievalBase as AuthRetrievalBase
9
+ from .auth_retrieval_t import AuthRetrievalOAuth as AuthRetrievalOAuth
10
+ from .auth_retrieval_t import AuthRetrievalBasic as AuthRetrievalBasic
11
+ from .auth_retrieval_t import AuthRetrieval as AuthRetrieval
12
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,75 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402 Q003
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ from pkgs.strenum_compat import StrEnum
11
+ import dataclasses
12
+ from pkgs.serialization import serial_class
13
+ from pkgs.serialization import serial_union_annotation
14
+ from . import secret_retrieval_t
15
+
16
+ __all__: list[str] = [
17
+ "AuthRetrieval",
18
+ "AuthRetrievalBase",
19
+ "AuthRetrievalBasic",
20
+ "AuthRetrievalOAuth",
21
+ "AuthRetrievalType",
22
+ ]
23
+
24
+
25
+ # DO NOT MODIFY -- This file is generated by type_spec
26
+ class AuthRetrievalType(StrEnum):
27
+ OAUTH = "oauth"
28
+ BASIC = "basic"
29
+
30
+
31
+ # DO NOT MODIFY -- This file is generated by type_spec
32
+ @serial_class(
33
+ named_type_path="sdk.auth_retrieval.AuthRetrievalBase",
34
+ )
35
+ @dataclasses.dataclass(kw_only=True)
36
+ class AuthRetrievalBase:
37
+ type: AuthRetrievalType
38
+
39
+
40
+ # DO NOT MODIFY -- This file is generated by type_spec
41
+ @serial_class(
42
+ named_type_path="sdk.auth_retrieval.AuthRetrievalOAuth",
43
+ parse_require={"type"},
44
+ )
45
+ @dataclasses.dataclass(kw_only=True)
46
+ class AuthRetrievalOAuth(AuthRetrievalBase):
47
+ type: typing.Literal[AuthRetrievalType.OAUTH] = AuthRetrievalType.OAUTH
48
+ refresh_token_secret: secret_retrieval_t.SecretRetrieval
49
+
50
+
51
+ # DO NOT MODIFY -- This file is generated by type_spec
52
+ @serial_class(
53
+ named_type_path="sdk.auth_retrieval.AuthRetrievalBasic",
54
+ parse_require={"type"},
55
+ )
56
+ @dataclasses.dataclass(kw_only=True)
57
+ class AuthRetrievalBasic(AuthRetrievalBase):
58
+ type: typing.Literal[AuthRetrievalType.BASIC] = AuthRetrievalType.BASIC
59
+ api_id_secret: secret_retrieval_t.SecretRetrieval
60
+ api_key_secret: secret_retrieval_t.SecretRetrieval
61
+
62
+
63
+ # DO NOT MODIFY -- This file is generated by type_spec
64
+ AuthRetrieval = typing.Annotated[
65
+ typing.Union[AuthRetrievalOAuth, AuthRetrievalBasic],
66
+ serial_union_annotation(
67
+ named_type_path="sdk.auth_retrieval.AuthRetrieval",
68
+ discriminator="type",
69
+ discriminator_map={
70
+ "oauth": AuthRetrievalOAuth,
71
+ "basic": AuthRetrievalBasic,
72
+ },
73
+ ),
74
+ ]
75
+ # DO NOT MODIFY -- This file is generated by type_spec