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,42 @@
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
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import identifier_t
13
+
14
+ __all__: list[str] = [
15
+ "Arguments",
16
+ "Data",
17
+ "ENDPOINT_METHOD",
18
+ "ENDPOINT_PATH",
19
+ ]
20
+
21
+ ENDPOINT_METHOD = "POST"
22
+ ENDPOINT_PATH = "api/external/recipes/archive"
23
+
24
+
25
+ # DO NOT MODIFY -- This file is generated by type_spec
26
+ @serial_class(
27
+ named_type_path="sdk.api.recipes.archive_recipes.Arguments",
28
+ )
29
+ @dataclasses.dataclass(kw_only=True)
30
+ class Arguments:
31
+ recipes: list[identifier_t.IdentifierKey]
32
+ reason: str | None = None
33
+
34
+
35
+ # DO NOT MODIFY -- This file is generated by type_spec
36
+ @serial_class(
37
+ named_type_path="sdk.api.recipes.archive_recipes.Data",
38
+ )
39
+ @dataclasses.dataclass(kw_only=True)
40
+ class Data:
41
+ pass
42
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,44 @@
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
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import async_batch_t
13
+ from ... import identifier_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ ]
21
+
22
+ ENDPOINT_METHOD = "POST"
23
+ ENDPOINT_PATH = "api/external/recipes/associate_recipe_as_input"
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.associate_recipe_as_input.Arguments",
29
+ )
30
+ @dataclasses.dataclass(kw_only=True)
31
+ class Arguments:
32
+ recipe_key: identifier_t.IdentifierKey
33
+ input_key: identifier_t.IdentifierKey | None = None
34
+ show_in_listings: bool | None = None
35
+
36
+
37
+ # DO NOT MODIFY -- This file is generated by type_spec
38
+ @serial_class(
39
+ named_type_path="sdk.api.recipes.associate_recipe_as_input.Data",
40
+ )
41
+ @dataclasses.dataclass(kw_only=True)
42
+ class Data(async_batch_t.AsyncBatchActionReturn):
43
+ pass
44
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,43 @@
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
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import async_batch_t
13
+ from ... import identifier_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ ]
21
+
22
+ ENDPOINT_METHOD = "POST"
23
+ ENDPOINT_PATH = "api/external/recipes/associate_recipe_as_lot"
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.associate_recipe_as_lot.Arguments",
29
+ )
30
+ @dataclasses.dataclass(kw_only=True)
31
+ class Arguments:
32
+ recipe_key: identifier_t.IdentifierKey
33
+ ingredient_key: identifier_t.IdentifierKey
34
+
35
+
36
+ # DO NOT MODIFY -- This file is generated by type_spec
37
+ @serial_class(
38
+ named_type_path="sdk.api.recipes.associate_recipe_as_lot.Data",
39
+ )
40
+ @dataclasses.dataclass(kw_only=True)
41
+ class Data(async_batch_t.AsyncBatchActionReturn):
42
+ pass
43
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,42 @@
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
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import async_batch_t
13
+ from ... import identifier_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ ]
21
+
22
+ ENDPOINT_METHOD = "POST"
23
+ ENDPOINT_PATH = "api/external/recipes/clear_recipe_outputs"
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.clear_recipe_outputs.Arguments",
29
+ )
30
+ @dataclasses.dataclass(kw_only=True)
31
+ class Arguments:
32
+ recipe_key: identifier_t.IdentifierKey
33
+
34
+
35
+ # DO NOT MODIFY -- This file is generated by type_spec
36
+ @serial_class(
37
+ named_type_path="sdk.api.recipes.clear_recipe_outputs.Data",
38
+ )
39
+ @dataclasses.dataclass(kw_only=True)
40
+ class Data(async_batch_t.AsyncBatchActionReturn):
41
+ pass
42
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,51 @@
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
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import base_t
13
+ from ... import identifier_t
14
+ from ... import recipe_identifiers_t
15
+ from ... import recipe_metadata_t
16
+
17
+ __all__: list[str] = [
18
+ "Arguments",
19
+ "Data",
20
+ "ENDPOINT_METHOD",
21
+ "ENDPOINT_PATH",
22
+ ]
23
+
24
+ ENDPOINT_METHOD = "POST"
25
+ ENDPOINT_PATH = "api/external/recipes/create_recipe"
26
+
27
+
28
+ # DO NOT MODIFY -- This file is generated by type_spec
29
+ @serial_class(
30
+ named_type_path="sdk.api.recipes.create_recipe.Arguments",
31
+ )
32
+ @dataclasses.dataclass(kw_only=True)
33
+ class Arguments:
34
+ material_family_id: base_t.ObjectId
35
+ workflow_id: base_t.ObjectId
36
+ name: str | None = None
37
+ project_id: base_t.ObjectId | None = None
38
+ workflow_variant_id: typing.Optional[base_t.ObjectId] | None = None
39
+ recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None
40
+ identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None
41
+ definition_key: identifier_t.IdentifierKey | None = None
42
+
43
+
44
+ # DO NOT MODIFY -- This file is generated by type_spec
45
+ @serial_class(
46
+ named_type_path="sdk.api.recipes.create_recipe.Data",
47
+ )
48
+ @dataclasses.dataclass(kw_only=True)
49
+ class Data:
50
+ result_id: base_t.ObjectId
51
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,15 +1,16 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
2
  # flake8: noqa: F821
3
- # ruff: noqa: E402
3
+ # ruff: noqa: E402 Q003
4
4
  # fmt: off
5
5
  # isort: skip_file
6
6
  from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
11
- from ... import base as base_t
12
- from ... import recipe_metadata as recipe_metadata_t
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import base_t
13
+ from ... import recipe_metadata_t
13
14
 
14
15
  __all__: list[str] = [
15
16
  "Arguments",
@@ -25,30 +26,42 @@ ENDPOINT_PATH = "api/external/recipes/external_create_recipes"
25
26
 
26
27
 
27
28
  # DO NOT MODIFY -- This file is generated by type_spec
28
- @dataclass(kw_only=True)
29
+ @serial_class(
30
+ named_type_path="sdk.api.recipes.create_recipes.CreateRecipeDefinition",
31
+ )
32
+ @dataclasses.dataclass(kw_only=True)
29
33
  class CreateRecipeDefinition:
30
34
  workflow_id: base_t.ObjectId
31
- name: typing.Optional[str] = None
32
- workflow_variant_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None
33
- recipe_metadata: typing.Optional[list[recipe_metadata_t.MetadataValue]] = None
35
+ name: str | None = None
36
+ workflow_variant_id: typing.Optional[base_t.ObjectId] | None = None
37
+ recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None
34
38
 
35
39
 
36
40
  # DO NOT MODIFY -- This file is generated by type_spec
37
- @dataclass(kw_only=True)
41
+ @serial_class(
42
+ named_type_path="sdk.api.recipes.create_recipes.Arguments",
43
+ )
44
+ @dataclasses.dataclass(kw_only=True)
38
45
  class Arguments:
39
46
  material_family_id: base_t.ObjectId
40
47
  recipe_definitions: list[CreateRecipeDefinition]
41
- project_id: typing.Optional[base_t.ObjectId] = None
48
+ project_id: base_t.ObjectId | None = None
42
49
 
43
50
 
44
51
  # DO NOT MODIFY -- This file is generated by type_spec
45
- @dataclass(kw_only=True)
52
+ @serial_class(
53
+ named_type_path="sdk.api.recipes.create_recipes.CreateRecipeResult",
54
+ )
55
+ @dataclasses.dataclass(kw_only=True)
46
56
  class CreateRecipeResult:
47
57
  recipe_id: base_t.ObjectId
48
58
 
49
59
 
50
60
  # DO NOT MODIFY -- This file is generated by type_spec
51
- @dataclass(kw_only=True)
61
+ @serial_class(
62
+ named_type_path="sdk.api.recipes.create_recipes.Data",
63
+ )
64
+ @dataclasses.dataclass(kw_only=True)
52
65
  class Data:
53
66
  recipes: list[CreateRecipeResult]
54
67
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,42 @@
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
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import async_batch_t
13
+ from ... import identifier_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ ]
21
+
22
+ ENDPOINT_METHOD = "POST"
23
+ ENDPOINT_PATH = "api/external/recipes/disassociate_recipe_as_input"
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.disassociate_recipe_as_input.Arguments",
29
+ )
30
+ @dataclasses.dataclass(kw_only=True)
31
+ class Arguments:
32
+ recipe_key: identifier_t.IdentifierKey
33
+
34
+
35
+ # DO NOT MODIFY -- This file is generated by type_spec
36
+ @serial_class(
37
+ named_type_path="sdk.api.recipes.disassociate_recipe_as_input.Data",
38
+ )
39
+ @dataclasses.dataclass(kw_only=True)
40
+ class Data(async_batch_t.AsyncBatchActionReturn):
41
+ pass
42
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,283 @@
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 identifier_t
15
+ from ... import inputs_t
16
+ from ... import recipe_inputs_t
17
+ from ... import recipe_workflow_steps_t
18
+
19
+ __all__: list[str] = [
20
+ "AnnotationEdit",
21
+ "Arguments",
22
+ "Data",
23
+ "ENDPOINT_METHOD",
24
+ "ENDPOINT_PATH",
25
+ "PlaceholderBase",
26
+ "PlaceholderDisplayMode",
27
+ "PlaceholderType",
28
+ "RecipeInputEdit",
29
+ "RecipeInputEditAddInput",
30
+ "RecipeInputEditAddInstructions",
31
+ "RecipeInputEditBase",
32
+ "RecipeInputEditChangeBasisViewed",
33
+ "RecipeInputEditClearInputs",
34
+ "RecipeInputEditInputBase",
35
+ "RecipeInputEditPlaceholder",
36
+ "RecipeInputEditSetLot",
37
+ "RecipeInputEditSetRole",
38
+ "RecipeInputEditType",
39
+ "RecipeInputEditUpdateAnnotations",
40
+ "RecipeInputEditUpsertInput",
41
+ "RecipeInputPlaceholder",
42
+ "SubcategoryPlaceholder",
43
+ ]
44
+
45
+ ENDPOINT_METHOD = "POST"
46
+ ENDPOINT_PATH = "api/external/recipes/edit_recipe_inputs"
47
+
48
+
49
+ # DO NOT MODIFY -- This file is generated by type_spec
50
+ class RecipeInputEditType(StrEnum):
51
+ CLEAR_INPUTS = "clear_inputs"
52
+ UPSERT_INPUT = "upsert_input"
53
+ ADD_INPUT = "add_input"
54
+ UPDATE_ANNOTATIONS = "update_annotations"
55
+ SET_LOT = "set_lot"
56
+ CHANGE_BASIS = "change_basis"
57
+ ADD_INSTRUCTIONS = "add_instructions"
58
+ SET_ROLE = "set_role"
59
+ SET_PLACEHOLDER = "set_placeholder"
60
+
61
+
62
+ # DO NOT MODIFY -- This file is generated by type_spec
63
+ @serial_class(
64
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditBase",
65
+ )
66
+ @dataclasses.dataclass(kw_only=True)
67
+ class RecipeInputEditBase:
68
+ type: RecipeInputEditType
69
+
70
+
71
+ # DO NOT MODIFY -- This file is generated by type_spec
72
+ @serial_class(
73
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditClearInputs",
74
+ parse_require={"type"},
75
+ )
76
+ @dataclasses.dataclass(kw_only=True)
77
+ class RecipeInputEditClearInputs(RecipeInputEditBase):
78
+ type: typing.Literal[RecipeInputEditType.CLEAR_INPUTS] = RecipeInputEditType.CLEAR_INPUTS
79
+
80
+
81
+ # DO NOT MODIFY -- This file is generated by type_spec
82
+ @serial_class(
83
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditInputBase",
84
+ to_string_values={"value_numeric"},
85
+ )
86
+ @dataclasses.dataclass(kw_only=True)
87
+ class RecipeInputEditInputBase(RecipeInputEditBase):
88
+ ingredient_key: identifier_t.IdentifierKey
89
+ quantity_basis: recipe_inputs_t.QuantityBasis = recipe_inputs_t.QuantityBasis.MASS
90
+ input_value_type: recipe_inputs_t.InputValueType = recipe_inputs_t.InputValueType.VALUE
91
+ value_numeric: Decimal | None = None
92
+ value_str: str | None = None
93
+ behavior: inputs_t.IngredientBehavior | None = None
94
+ calculation_key: identifier_t.IdentifierKey | None = None
95
+
96
+
97
+ # DO NOT MODIFY -- This file is generated by type_spec
98
+ @serial_class(
99
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditChangeBasisViewed",
100
+ parse_require={"type"},
101
+ )
102
+ @dataclasses.dataclass(kw_only=True)
103
+ class RecipeInputEditChangeBasisViewed(RecipeInputEditInputBase):
104
+ type: typing.Literal[RecipeInputEditType.CHANGE_BASIS] = RecipeInputEditType.CHANGE_BASIS
105
+
106
+
107
+ # DO NOT MODIFY -- This file is generated by type_spec
108
+ @serial_class(
109
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditUpsertInput",
110
+ parse_require={"type"},
111
+ )
112
+ @dataclasses.dataclass(kw_only=True)
113
+ class RecipeInputEditUpsertInput(RecipeInputEditInputBase):
114
+ type: typing.Literal[RecipeInputEditType.UPSERT_INPUT] = RecipeInputEditType.UPSERT_INPUT
115
+ clear_first: bool
116
+
117
+
118
+ # DO NOT MODIFY -- This file is generated by type_spec
119
+ @serial_class(
120
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditAddInput",
121
+ parse_require={"type"},
122
+ )
123
+ @dataclasses.dataclass(kw_only=True)
124
+ class RecipeInputEditAddInput(RecipeInputEditInputBase):
125
+ type: typing.Literal[RecipeInputEditType.ADD_INPUT] = RecipeInputEditType.ADD_INPUT
126
+
127
+
128
+ # DO NOT MODIFY -- This file is generated by type_spec
129
+ @serial_class(
130
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditSetLot",
131
+ parse_require={"type"},
132
+ )
133
+ @dataclasses.dataclass(kw_only=True)
134
+ class RecipeInputEditSetLot(RecipeInputEditBase):
135
+ type: typing.Literal[RecipeInputEditType.SET_LOT] = RecipeInputEditType.SET_LOT
136
+ ingredient_key: identifier_t.IdentifierKey
137
+ ingredient_lot_recipe_key: identifier_t.IdentifierKey
138
+
139
+
140
+ # DO NOT MODIFY -- This file is generated by type_spec
141
+ @serial_class(
142
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditAddInstructions",
143
+ parse_require={"type"},
144
+ )
145
+ @dataclasses.dataclass(kw_only=True)
146
+ class RecipeInputEditAddInstructions(RecipeInputEditBase):
147
+ type: typing.Literal[RecipeInputEditType.ADD_INSTRUCTIONS] = RecipeInputEditType.ADD_INSTRUCTIONS
148
+ instructions: str
149
+
150
+
151
+ # DO NOT MODIFY -- This file is generated by type_spec
152
+ @serial_class(
153
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.AnnotationEdit",
154
+ to_string_values={"lower_value", "upper_value"},
155
+ )
156
+ @dataclasses.dataclass(kw_only=True)
157
+ class AnnotationEdit:
158
+ annotation_type_key: identifier_t.IdentifierKey
159
+ lower_value: Decimal | None = None
160
+ upper_value: Decimal | None = None
161
+
162
+
163
+ # DO NOT MODIFY -- This file is generated by type_spec
164
+ @serial_class(
165
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditUpdateAnnotations",
166
+ parse_require={"type"},
167
+ )
168
+ @dataclasses.dataclass(kw_only=True)
169
+ class RecipeInputEditUpdateAnnotations(RecipeInputEditInputBase):
170
+ type: typing.Literal[RecipeInputEditType.UPDATE_ANNOTATIONS] = RecipeInputEditType.UPDATE_ANNOTATIONS
171
+ clear_first: bool
172
+ annotations: list[AnnotationEdit]
173
+
174
+
175
+ # DO NOT MODIFY -- This file is generated by type_spec
176
+ @serial_class(
177
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditSetRole",
178
+ parse_require={"type"},
179
+ )
180
+ @dataclasses.dataclass(kw_only=True)
181
+ class RecipeInputEditSetRole(RecipeInputEditBase):
182
+ type: typing.Literal[RecipeInputEditType.SET_ROLE] = RecipeInputEditType.SET_ROLE
183
+ ingredient_key: identifier_t.IdentifierKey
184
+ ingredient_role_key: typing.Optional[identifier_t.IdentifierKey]
185
+
186
+
187
+ # DO NOT MODIFY -- This file is generated by type_spec
188
+ class PlaceholderType(StrEnum):
189
+ SUBCATEGORY = "subcategory"
190
+
191
+
192
+ # DO NOT MODIFY -- This file is generated by type_spec
193
+ class PlaceholderDisplayMode(StrEnum):
194
+ INLINE = "inline"
195
+
196
+
197
+ # DO NOT MODIFY -- This file is generated by type_spec
198
+ @serial_class(
199
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.PlaceholderBase",
200
+ )
201
+ @dataclasses.dataclass(kw_only=True)
202
+ class PlaceholderBase:
203
+ type: PlaceholderType
204
+ require_for_creation: bool = True
205
+ display_mode: PlaceholderDisplayMode = PlaceholderDisplayMode.INLINE
206
+
207
+
208
+ # DO NOT MODIFY -- This file is generated by type_spec
209
+ @serial_class(
210
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.SubcategoryPlaceholder",
211
+ parse_require={"type"},
212
+ )
213
+ @dataclasses.dataclass(kw_only=True)
214
+ class SubcategoryPlaceholder(PlaceholderBase):
215
+ type: typing.Literal[PlaceholderType.SUBCATEGORY] = PlaceholderType.SUBCATEGORY
216
+ subcategory_identifier: identifier_t.IdentifierKey
217
+
218
+
219
+ # DO NOT MODIFY -- This file is generated by type_spec
220
+ RecipeInputPlaceholder = typing.Annotated[
221
+ typing.Union[SubcategoryPlaceholder],
222
+ serial_union_annotation(
223
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputPlaceholder",
224
+ discriminator="type",
225
+ discriminator_map={
226
+ "subcategory": SubcategoryPlaceholder,
227
+ },
228
+ ),
229
+ ]
230
+
231
+
232
+ # DO NOT MODIFY -- This file is generated by type_spec
233
+ @serial_class(
234
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditPlaceholder",
235
+ parse_require={"type"},
236
+ )
237
+ @dataclasses.dataclass(kw_only=True)
238
+ class RecipeInputEditPlaceholder(RecipeInputEditBase):
239
+ type: typing.Literal[RecipeInputEditType.SET_PLACEHOLDER] = RecipeInputEditType.SET_PLACEHOLDER
240
+ ingredient_key: identifier_t.IdentifierKey
241
+ placeholder: RecipeInputPlaceholder
242
+
243
+
244
+ # DO NOT MODIFY -- This file is generated by type_spec
245
+ RecipeInputEdit = typing.Annotated[
246
+ typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations, RecipeInputEditSetLot, RecipeInputEditChangeBasisViewed, RecipeInputEditAddInstructions, RecipeInputEditSetRole, RecipeInputEditPlaceholder],
247
+ serial_union_annotation(
248
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEdit",
249
+ discriminator="type",
250
+ discriminator_map={
251
+ "clear_inputs": RecipeInputEditClearInputs,
252
+ "upsert_input": RecipeInputEditUpsertInput,
253
+ "add_input": RecipeInputEditAddInput,
254
+ "update_annotations": RecipeInputEditUpdateAnnotations,
255
+ "set_lot": RecipeInputEditSetLot,
256
+ "change_basis": RecipeInputEditChangeBasisViewed,
257
+ "add_instructions": RecipeInputEditAddInstructions,
258
+ "set_role": RecipeInputEditSetRole,
259
+ "set_placeholder": RecipeInputEditPlaceholder,
260
+ },
261
+ ),
262
+ ]
263
+
264
+
265
+ # DO NOT MODIFY -- This file is generated by type_spec
266
+ @serial_class(
267
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.Arguments",
268
+ )
269
+ @dataclasses.dataclass(kw_only=True)
270
+ class Arguments:
271
+ recipe_key: identifier_t.IdentifierKey
272
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier
273
+ edits: list[RecipeInputEdit]
274
+
275
+
276
+ # DO NOT MODIFY -- This file is generated by type_spec
277
+ @serial_class(
278
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.Data",
279
+ )
280
+ @dataclasses.dataclass(kw_only=True)
281
+ class Data:
282
+ pass
283
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,58 @@
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
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import base_t
13
+ from ... import identifier_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ "RecipeColumnCalculationValue",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "GET"
24
+ ENDPOINT_PATH = "api/external/recipes/get_column_calculation_values"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.get_column_calculation_values.Arguments",
30
+ )
31
+ @dataclasses.dataclass(kw_only=True)
32
+ class Arguments:
33
+ recipe_keys: list[identifier_t.IdentifierKey]
34
+ calculation_key: identifier_t.IdentifierKey
35
+
36
+
37
+ # DO NOT MODIFY -- This file is generated by type_spec
38
+ @serial_class(
39
+ named_type_path="sdk.api.recipes.get_column_calculation_values.RecipeColumnCalculationValue",
40
+ to_string_values={"calculation_quantity"},
41
+ )
42
+ @dataclasses.dataclass(kw_only=True)
43
+ class RecipeColumnCalculationValue:
44
+ recipe_id: base_t.ObjectId
45
+ ingredient_id: base_t.ObjectId
46
+ recipe_step_id: base_t.ObjectId
47
+ recipe_input_id: base_t.ObjectId
48
+ calculation_quantity: Decimal | None = None
49
+
50
+
51
+ # DO NOT MODIFY -- This file is generated by type_spec
52
+ @serial_class(
53
+ named_type_path="sdk.api.recipes.get_column_calculation_values.Data",
54
+ )
55
+ @dataclasses.dataclass(kw_only=True)
56
+ class Data:
57
+ values: list[RecipeColumnCalculationValue]
58
+ # DO NOT MODIFY -- This file is generated by type_spec