UncountablePythonSDK 0.0.7__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 (311) 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.7.dist-info → UncountablePythonSDK-0.0.92.dist-info}/WHEEL +1 -1
  4. {UncountablePythonSDK-0.0.7.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/opaque_key.py +1 -1
  49. pkgs/serialization/serial_alias.py +47 -0
  50. pkgs/serialization/serial_class.py +65 -50
  51. pkgs/serialization/serial_generic.py +16 -0
  52. pkgs/serialization/serial_union.py +84 -0
  53. pkgs/serialization/yaml.py +57 -0
  54. pkgs/serialization_util/__init__.py +7 -7
  55. pkgs/serialization_util/_get_type_for_serialization.py +1 -3
  56. pkgs/serialization_util/convert_to_snakecase.py +27 -0
  57. pkgs/serialization_util/dataclasses.py +14 -0
  58. pkgs/serialization_util/serialization_helpers.py +118 -73
  59. pkgs/strenum_compat/strenum_compat.py +1 -9
  60. pkgs/type_spec/actions_registry/__init__.py +0 -0
  61. pkgs/type_spec/actions_registry/__main__.py +126 -0
  62. pkgs/type_spec/actions_registry/emit_typescript.py +182 -0
  63. pkgs/type_spec/builder.py +475 -89
  64. pkgs/type_spec/config.py +24 -19
  65. pkgs/type_spec/emit_io_ts.py +5 -2
  66. pkgs/type_spec/emit_open_api.py +266 -32
  67. pkgs/type_spec/emit_open_api_util.py +32 -13
  68. pkgs/type_spec/emit_python.py +601 -150
  69. pkgs/type_spec/emit_typescript.py +74 -273
  70. pkgs/type_spec/emit_typescript_util.py +239 -5
  71. pkgs/type_spec/load_types.py +55 -10
  72. pkgs/type_spec/open_api_util.py +30 -41
  73. pkgs/type_spec/parts/base.py.prepart +4 -3
  74. pkgs/type_spec/type_info/emit_type_info.py +178 -16
  75. pkgs/type_spec/util.py +11 -11
  76. pkgs/type_spec/value_spec/__main__.py +3 -3
  77. pkgs/type_spec/value_spec/convert_type.py +8 -1
  78. pkgs/type_spec/value_spec/emit_python.py +13 -4
  79. uncountable/__init__.py +1 -2
  80. uncountable/core/__init__.py +12 -2
  81. uncountable/core/async_batch.py +37 -0
  82. uncountable/core/client.py +293 -43
  83. uncountable/core/environment.py +41 -0
  84. uncountable/core/file_upload.py +135 -0
  85. uncountable/core/types.py +17 -0
  86. uncountable/integration/__init__.py +0 -0
  87. uncountable/integration/cli.py +49 -0
  88. uncountable/integration/construct_client.py +51 -0
  89. uncountable/integration/cron.py +29 -0
  90. uncountable/integration/db/__init__.py +0 -0
  91. uncountable/integration/db/connect.py +18 -0
  92. uncountable/integration/db/session.py +25 -0
  93. uncountable/integration/entrypoint.py +13 -0
  94. uncountable/integration/executors/__init__.py +0 -0
  95. uncountable/integration/executors/executors.py +148 -0
  96. uncountable/integration/executors/generic_upload_executor.py +284 -0
  97. uncountable/integration/executors/script_executor.py +25 -0
  98. uncountable/integration/job.py +87 -0
  99. uncountable/integration/queue_runner/__init__.py +0 -0
  100. uncountable/integration/queue_runner/command_server/__init__.py +24 -0
  101. uncountable/integration/queue_runner/command_server/command_client.py +68 -0
  102. uncountable/integration/queue_runner/command_server/command_server.py +64 -0
  103. uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  104. uncountable/integration/queue_runner/command_server/protocol/command_server.proto +22 -0
  105. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +40 -0
  106. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +38 -0
  107. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +129 -0
  108. uncountable/integration/queue_runner/command_server/types.py +52 -0
  109. uncountable/integration/queue_runner/datastore/__init__.py +3 -0
  110. uncountable/integration/queue_runner/datastore/datastore_sqlite.py +93 -0
  111. uncountable/integration/queue_runner/datastore/interface.py +19 -0
  112. uncountable/integration/queue_runner/datastore/model.py +17 -0
  113. uncountable/integration/queue_runner/job_scheduler.py +163 -0
  114. uncountable/integration/queue_runner/queue_runner.py +26 -0
  115. uncountable/integration/queue_runner/types.py +7 -0
  116. uncountable/integration/queue_runner/worker.py +119 -0
  117. uncountable/integration/scan_profiles.py +67 -0
  118. uncountable/integration/scheduler.py +150 -0
  119. uncountable/integration/secret_retrieval/__init__.py +3 -0
  120. uncountable/integration/secret_retrieval/retrieve_secret.py +93 -0
  121. uncountable/integration/server.py +117 -0
  122. uncountable/integration/telemetry.py +209 -0
  123. uncountable/integration/webhook_server/entrypoint.py +170 -0
  124. uncountable/types/__init__.py +151 -5
  125. uncountable/types/api/batch/execute_batch.py +15 -7
  126. uncountable/types/api/batch/execute_batch_load_async.py +42 -0
  127. uncountable/types/api/chemical/__init__.py +1 -0
  128. uncountable/types/api/chemical/convert_chemical_formats.py +63 -0
  129. uncountable/types/api/entity/create_entities.py +23 -10
  130. uncountable/types/api/entity/create_entity.py +21 -12
  131. uncountable/types/api/entity/get_entities_data.py +19 -29
  132. uncountable/types/api/entity/grant_entity_permissions.py +48 -0
  133. uncountable/types/api/entity/list_entities.py +28 -20
  134. uncountable/types/api/entity/lock_entity.py +45 -0
  135. uncountable/types/api/entity/resolve_entity_ids.py +19 -7
  136. uncountable/types/api/entity/set_entity_field_values.py +44 -0
  137. uncountable/types/api/entity/set_values.py +13 -28
  138. uncountable/types/api/entity/transition_entity_phase.py +80 -0
  139. uncountable/types/api/entity/unlock_entity.py +44 -0
  140. uncountable/types/api/equipment/__init__.py +1 -0
  141. uncountable/types/api/equipment/associate_equipment_input.py +44 -0
  142. uncountable/types/api/field_options/__init__.py +1 -0
  143. uncountable/types/api/field_options/upsert_field_options.py +55 -0
  144. uncountable/types/api/files/__init__.py +1 -0
  145. uncountable/types/api/files/download_file.py +77 -0
  146. uncountable/types/api/id_source/__init__.py +1 -0
  147. uncountable/types/api/id_source/list_id_source.py +56 -0
  148. uncountable/types/api/id_source/match_id_source.py +54 -0
  149. uncountable/types/api/input_groups/get_input_group_names.py +18 -7
  150. uncountable/types/api/inputs/create_inputs.py +25 -24
  151. uncountable/types/api/inputs/get_input_data.py +37 -31
  152. uncountable/types/api/inputs/get_input_names.py +20 -9
  153. uncountable/types/api/inputs/get_inputs_data.py +33 -27
  154. uncountable/types/api/inputs/set_input_attribute_values.py +18 -13
  155. uncountable/types/api/inputs/set_input_category.py +44 -0
  156. uncountable/types/api/inputs/set_input_subcategories.py +45 -0
  157. uncountable/types/api/inputs/set_intermediate_type.py +50 -0
  158. uncountable/types/api/material_families/__init__.py +1 -0
  159. uncountable/types/api/material_families/update_entity_material_families.py +48 -0
  160. uncountable/types/api/outputs/get_output_data.py +38 -29
  161. uncountable/types/api/outputs/get_output_names.py +20 -9
  162. uncountable/types/api/outputs/resolve_output_conditions.py +23 -10
  163. uncountable/types/api/permissions/__init__.py +1 -0
  164. uncountable/types/api/permissions/set_core_permissions.py +105 -0
  165. uncountable/types/api/project/get_projects.py +23 -19
  166. uncountable/types/api/project/get_projects_data.py +26 -43
  167. uncountable/types/api/recipe_links/__init__.py +1 -0
  168. uncountable/types/api/recipe_links/create_recipe_link.py +46 -0
  169. uncountable/types/api/recipe_links/remove_recipe_link.py +45 -0
  170. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +21 -10
  171. uncountable/types/api/recipes/add_recipe_to_project.py +42 -0
  172. uncountable/types/api/recipes/archive_recipes.py +42 -0
  173. uncountable/types/api/recipes/associate_recipe_as_input.py +44 -0
  174. uncountable/types/api/recipes/associate_recipe_as_lot.py +43 -0
  175. uncountable/types/api/recipes/clear_recipe_outputs.py +42 -0
  176. uncountable/types/api/recipes/create_recipe.py +51 -0
  177. uncountable/types/api/recipes/create_recipes.py +25 -24
  178. uncountable/types/api/recipes/disassociate_recipe_as_input.py +42 -0
  179. uncountable/types/api/recipes/edit_recipe_inputs.py +283 -0
  180. uncountable/types/api/recipes/get_column_calculation_values.py +58 -0
  181. uncountable/types/api/recipes/get_curve.py +13 -27
  182. uncountable/types/api/recipes/get_recipe_calculations.py +21 -21
  183. uncountable/types/api/recipes/get_recipe_links.py +14 -6
  184. uncountable/types/api/recipes/get_recipe_names.py +18 -7
  185. uncountable/types/api/recipes/get_recipe_output_metadata.py +18 -19
  186. uncountable/types/api/recipes/get_recipes_data.py +83 -144
  187. uncountable/types/api/recipes/lock_recipes.py +63 -0
  188. uncountable/types/api/recipes/remove_recipe_from_project.py +42 -0
  189. uncountable/types/api/recipes/set_recipe_inputs.py +21 -11
  190. uncountable/types/api/recipes/set_recipe_metadata.py +43 -0
  191. uncountable/types/api/recipes/set_recipe_output_annotations.py +115 -0
  192. uncountable/types/api/recipes/set_recipe_output_file.py +56 -0
  193. uncountable/types/api/recipes/set_recipe_outputs.py +28 -15
  194. uncountable/types/api/recipes/set_recipe_tags.py +109 -0
  195. uncountable/types/api/recipes/unarchive_recipes.py +41 -0
  196. uncountable/types/api/recipes/unlock_recipes.py +50 -0
  197. uncountable/types/api/triggers/__init__.py +1 -0
  198. uncountable/types/api/triggers/run_trigger.py +43 -0
  199. uncountable/types/api/uploader/__init__.py +1 -0
  200. uncountable/types/api/uploader/invoke_uploader.py +47 -0
  201. uncountable/types/async_batch.py +13 -0
  202. uncountable/types/async_batch_processor.py +384 -0
  203. uncountable/types/async_batch_t.py +97 -0
  204. uncountable/types/async_jobs.py +9 -0
  205. uncountable/types/async_jobs_t.py +53 -0
  206. uncountable/types/auth_retrieval.py +12 -0
  207. uncountable/types/auth_retrieval_t.py +75 -0
  208. uncountable/types/base.py +5 -78
  209. uncountable/types/base_t.py +85 -0
  210. uncountable/types/calculations.py +8 -0
  211. uncountable/types/calculations_t.py +27 -0
  212. uncountable/types/chemical_structure.py +8 -0
  213. uncountable/types/chemical_structure_t.py +28 -0
  214. uncountable/types/client_base.py +1115 -76
  215. uncountable/types/client_config.py +8 -0
  216. uncountable/types/client_config_t.py +26 -0
  217. uncountable/types/curves.py +10 -0
  218. uncountable/types/curves_t.py +51 -0
  219. uncountable/types/entity.py +8 -266
  220. uncountable/types/entity_t.py +393 -0
  221. uncountable/types/experiment_groups.py +8 -0
  222. uncountable/types/experiment_groups_t.py +27 -0
  223. uncountable/types/field_values.py +17 -23
  224. uncountable/types/field_values_t.py +204 -0
  225. uncountable/types/fields.py +8 -0
  226. uncountable/types/fields_t.py +28 -0
  227. uncountable/types/generic_upload.py +15 -0
  228. uncountable/types/generic_upload_t.py +119 -0
  229. uncountable/types/id_source.py +12 -0
  230. uncountable/types/id_source_t.py +68 -0
  231. uncountable/types/identifier.py +11 -0
  232. uncountable/types/identifier_t.py +63 -0
  233. uncountable/types/input_attributes.py +8 -0
  234. uncountable/types/input_attributes_t.py +30 -0
  235. uncountable/types/inputs.py +11 -0
  236. uncountable/types/inputs_t.py +83 -0
  237. uncountable/types/integration_server.py +9 -0
  238. uncountable/types/integration_server_t.py +42 -0
  239. uncountable/types/job_definition.py +27 -0
  240. uncountable/types/job_definition_t.py +260 -0
  241. uncountable/types/outputs.py +8 -0
  242. uncountable/types/outputs_t.py +30 -0
  243. uncountable/types/overrides.py +10 -0
  244. uncountable/types/overrides_t.py +49 -0
  245. uncountable/types/permissions.py +8 -0
  246. uncountable/types/permissions_t.py +46 -0
  247. uncountable/types/phases.py +8 -0
  248. uncountable/types/phases_t.py +27 -0
  249. uncountable/types/post_base.py +8 -0
  250. uncountable/types/post_base_t.py +30 -0
  251. uncountable/types/queued_job.py +16 -0
  252. uncountable/types/queued_job_t.py +123 -0
  253. uncountable/types/recipe_identifiers.py +12 -0
  254. uncountable/types/recipe_identifiers_t.py +76 -0
  255. uncountable/types/recipe_inputs.py +9 -0
  256. uncountable/types/recipe_inputs_t.py +30 -0
  257. uncountable/types/recipe_links.py +4 -44
  258. uncountable/types/recipe_links_t.py +54 -0
  259. uncountable/types/recipe_metadata.py +10 -0
  260. uncountable/types/recipe_metadata_t.py +58 -0
  261. uncountable/types/recipe_output_metadata.py +8 -0
  262. uncountable/types/recipe_output_metadata_t.py +28 -0
  263. uncountable/types/recipe_tags.py +8 -0
  264. uncountable/types/recipe_tags_t.py +27 -0
  265. uncountable/types/recipe_workflow_steps.py +14 -0
  266. uncountable/types/recipe_workflow_steps_t.py +95 -0
  267. uncountable/types/recipes.py +8 -0
  268. uncountable/types/recipes_t.py +25 -0
  269. uncountable/types/response.py +8 -0
  270. uncountable/types/response_t.py +26 -0
  271. uncountable/types/secret_retrieval.py +12 -0
  272. uncountable/types/secret_retrieval_t.py +75 -0
  273. uncountable/types/units.py +8 -0
  274. uncountable/types/units_t.py +27 -0
  275. uncountable/types/users.py +8 -0
  276. uncountable/types/users_t.py +28 -0
  277. uncountable/types/webhook_job.py +9 -0
  278. uncountable/types/webhook_job_t.py +37 -0
  279. uncountable/types/workflows.py +9 -0
  280. uncountable/types/workflows_t.py +39 -0
  281. UncountablePythonSDK-0.0.7.dist-info/METADATA +0 -27
  282. UncountablePythonSDK-0.0.7.dist-info/RECORD +0 -119
  283. examples/recipe-import/importer.py +0 -39
  284. type_spec/external/api/batch/execute_batch.yaml +0 -56
  285. type_spec/external/api/entity/create_entities.yaml +0 -33
  286. type_spec/external/api/entity/create_entity.yaml +0 -39
  287. type_spec/external/api/entity/get_entities_data.yaml +0 -55
  288. type_spec/external/api/entity/list_entities.yaml +0 -62
  289. type_spec/external/api/entity/resolve_entity_ids.yaml +0 -29
  290. type_spec/external/api/entity/set_values.yaml +0 -45
  291. type_spec/external/api/input_groups/get_input_group_names.yaml +0 -29
  292. type_spec/external/api/inputs/create_inputs.yaml +0 -61
  293. type_spec/external/api/inputs/get_input_data.yaml +0 -108
  294. type_spec/external/api/inputs/get_input_names.yaml +0 -38
  295. type_spec/external/api/inputs/get_inputs_data.yaml +0 -95
  296. type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -37
  297. type_spec/external/api/outputs/get_output_data.yaml +0 -103
  298. type_spec/external/api/outputs/get_output_names.yaml +0 -35
  299. type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -50
  300. type_spec/external/api/project/get_projects.yaml +0 -52
  301. type_spec/external/api/project/get_projects_data.yaml +0 -86
  302. type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -41
  303. type_spec/external/api/recipes/create_recipes.yaml +0 -60
  304. type_spec/external/api/recipes/get_curve.yaml +0 -50
  305. type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -49
  306. type_spec/external/api/recipes/get_recipe_links.yaml +0 -26
  307. type_spec/external/api/recipes/get_recipe_names.yaml +0 -29
  308. type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -49
  309. type_spec/external/api/recipes/get_recipes_data.yaml +0 -372
  310. type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -36
  311. type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -56
@@ -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
@@ -1,19 +1,19 @@
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
10
+ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
+ from ... import base_t
13
+ from ... import curves_t
12
14
 
13
15
  __all__: list[str] = [
14
16
  "Arguments",
15
- "Curve",
16
- "CurveValue",
17
17
  "Data",
18
18
  "ENDPOINT_METHOD",
19
19
  "ENDPOINT_PATH",
@@ -24,34 +24,20 @@ ENDPOINT_PATH = "api/external/recipes/external_get_curve"
24
24
 
25
25
 
26
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
- @dataclass(kw_only=True)
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.get_curve.Arguments",
29
+ )
30
+ @dataclasses.dataclass(kw_only=True)
28
31
  class Arguments:
29
- recipe_output_id: int
32
+ recipe_output_id: base_t.ObjectId | None = None
33
+ recipe_input_id: base_t.ObjectId | None = None
30
34
 
31
35
 
32
36
  # DO NOT MODIFY -- This file is generated by type_spec
33
37
  @serial_class(
34
- to_string_values={"quantity"},
38
+ named_type_path="sdk.api.recipes.get_curve.Data",
35
39
  )
36
- @dataclass(kw_only=True)
37
- class CurveValue:
38
- index: int
39
- quantity: typing.Optional[Decimal] = None
40
- quantity_timestamp: typing.Optional[datetime.datetime] = None
41
-
42
-
43
- # DO NOT MODIFY -- This file is generated by type_spec
44
- @dataclass(kw_only=True)
45
- class Curve:
46
- id: int
47
- x_type: str
48
- x_values: list[CurveValue]
49
- y_type: str
50
- y_values: list[CurveValue]
51
-
52
-
53
- # DO NOT MODIFY -- This file is generated by type_spec
54
- @dataclass(kw_only=True)
40
+ @dataclasses.dataclass(kw_only=True)
55
41
  class Data:
56
- curve: Curve
42
+ curve: curves_t.Curve
57
43
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,19 +1,19 @@
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
10
+ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
- from ... import base as base_t
12
+ from ... import base_t
13
+ from ... import calculations_t
13
14
 
14
15
  __all__: list[str] = [
15
16
  "Arguments",
16
- "Calculation",
17
17
  "Data",
18
18
  "ENDPOINT_METHOD",
19
19
  "ENDPOINT_PATH",
@@ -25,35 +25,35 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipe_calculations"
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
- @dataclass(kw_only=True)
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.get_recipe_calculations.Arguments",
30
+ )
31
+ @dataclasses.dataclass(kw_only=True)
29
32
  class Arguments:
30
- recipe_ids: list[int]
31
- calculation_ids: typing.Optional[list[int]] = None
33
+ recipe_ids: list[base_t.ObjectId]
34
+ calculation_ids: list[base_t.ObjectId] | None = None
32
35
 
33
36
 
34
37
  # DO NOT MODIFY -- This file is generated by type_spec
35
38
  @serial_class(
39
+ named_type_path="sdk.api.recipes.get_recipe_calculations.RecipeCalculation",
36
40
  unconverted_values={"quantity_json"},
37
41
  to_string_values={"quantity_dec"},
38
42
  )
39
- @dataclass(kw_only=True)
43
+ @dataclasses.dataclass(kw_only=True)
40
44
  class RecipeCalculation:
41
- recipe_id: int
42
- calculation_id: int
43
- quantity_dec: Decimal
44
- quantity_json: base_t.JsonValue
45
+ recipe_id: base_t.ObjectId
46
+ calculation_id: base_t.ObjectId
47
+ quantity_dec: Decimal | None = None
48
+ quantity_json: base_t.JsonValue | None = None
45
49
 
46
50
 
47
51
  # DO NOT MODIFY -- This file is generated by type_spec
48
- @dataclass(kw_only=True)
49
- class Calculation:
50
- id: int
51
- name: str
52
-
53
-
54
- # DO NOT MODIFY -- This file is generated by type_spec
55
- @dataclass(kw_only=True)
52
+ @serial_class(
53
+ named_type_path="sdk.api.recipes.get_recipe_calculations.Data",
54
+ )
55
+ @dataclasses.dataclass(kw_only=True)
56
56
  class Data:
57
57
  recipe_calculations: list[RecipeCalculation]
58
- calculations: list[Calculation]
58
+ calculations: list[calculations_t.Calculation]
59
59
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,14 +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 recipe_links as recipe_links_t
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import base_t
13
+ from ... import recipe_links_t
12
14
 
13
15
  __all__: list[str] = [
14
16
  "Arguments",
@@ -22,15 +24,21 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipe_links"
22
24
 
23
25
 
24
26
  # DO NOT MODIFY -- This file is generated by type_spec
25
- @dataclass(kw_only=True)
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.get_recipe_links.Arguments",
29
+ )
30
+ @dataclasses.dataclass(kw_only=True)
26
31
  class Arguments:
27
- recipe_ids: list[int]
32
+ recipe_ids: list[base_t.ObjectId]
28
33
  depth: int = 1
29
34
  link_types: typing.Optional[list[recipe_links_t.RecipeLinkType]]
30
35
 
31
36
 
32
37
  # DO NOT MODIFY -- This file is generated by type_spec
33
- @dataclass(kw_only=True)
38
+ @serial_class(
39
+ named_type_path="sdk.api.recipes.get_recipe_links.Data",
40
+ )
41
+ @dataclasses.dataclass(kw_only=True)
34
42
  class Data:
35
43
  recipe_links: list[recipe_links_t.RecipeLink]
36
44
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,13 +1,15 @@
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
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import base_t
11
13
 
12
14
  __all__: list[str] = [
13
15
  "Arguments",
@@ -22,20 +24,29 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipe_names"
22
24
 
23
25
 
24
26
  # DO NOT MODIFY -- This file is generated by type_spec
25
- @dataclass(kw_only=True)
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.get_recipe_names.Arguments",
29
+ )
30
+ @dataclasses.dataclass(kw_only=True)
26
31
  class Arguments:
27
- project_id: int
32
+ project_id: base_t.ObjectId
28
33
 
29
34
 
30
35
  # DO NOT MODIFY -- This file is generated by type_spec
31
- @dataclass(kw_only=True)
36
+ @serial_class(
37
+ named_type_path="sdk.api.recipes.get_recipe_names.SimpleRecipe",
38
+ )
39
+ @dataclasses.dataclass(kw_only=True)
32
40
  class SimpleRecipe:
33
- id: int
41
+ id: base_t.ObjectId
34
42
  name: str
35
43
 
36
44
 
37
45
  # DO NOT MODIFY -- This file is generated by type_spec
38
- @dataclass(kw_only=True)
46
+ @serial_class(
47
+ named_type_path="sdk.api.recipes.get_recipe_names.Data",
48
+ )
49
+ @dataclasses.dataclass(kw_only=True)
39
50
  class Data:
40
51
  recipes: list[SimpleRecipe]
41
52
  # 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
10
+ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
- from ... import base as base_t
12
+ from ... import base_t
13
+ from ... import recipe_output_metadata_t
13
14
 
14
15
  __all__: list[str] = [
15
16
  "Arguments",
@@ -17,7 +18,6 @@ __all__: list[str] = [
17
18
  "ENDPOINT_METHOD",
18
19
  "ENDPOINT_PATH",
19
20
  "RecipeOutputMetadata",
20
- "RecipeOutputMetadataField",
21
21
  ]
22
22
 
23
23
  ENDPOINT_METHOD = "GET"
@@ -25,35 +25,34 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipe_output_metadata"
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
- @dataclass(kw_only=True)
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.get_recipe_output_metadata.Arguments",
30
+ )
31
+ @dataclasses.dataclass(kw_only=True)
29
32
  class Arguments:
30
- recipe_output_ids: list[int]
33
+ recipe_output_ids: list[base_t.ObjectId]
31
34
 
32
35
 
33
36
  # DO NOT MODIFY -- This file is generated by type_spec
34
37
  @serial_class(
38
+ named_type_path="sdk.api.recipes.get_recipe_output_metadata.RecipeOutputMetadata",
35
39
  unconverted_values={"quantity_json"},
36
40
  to_string_values={"quantity_dec"},
37
41
  )
38
- @dataclass(kw_only=True)
42
+ @dataclasses.dataclass(kw_only=True)
39
43
  class RecipeOutputMetadata:
40
- recipe_output_id: int
41
- recipe_output_metadata_field_id: int
44
+ recipe_output_id: base_t.ObjectId
45
+ recipe_output_metadata_field_id: base_t.ObjectId
42
46
  quantity_dec: Decimal
43
47
  quantity_json: base_t.JsonValue
44
48
 
45
49
 
46
50
  # DO NOT MODIFY -- This file is generated by type_spec
47
- @dataclass(kw_only=True)
48
- class RecipeOutputMetadataField:
49
- id: int
50
- name: str
51
- quantity_type: str
52
-
53
-
54
- # DO NOT MODIFY -- This file is generated by type_spec
55
- @dataclass(kw_only=True)
51
+ @serial_class(
52
+ named_type_path="sdk.api.recipes.get_recipe_output_metadata.Data",
53
+ )
54
+ @dataclasses.dataclass(kw_only=True)
56
55
  class Data:
57
56
  recipe_output_metadata: list[RecipeOutputMetadata]
58
- recipe_output_metadata_fields: list[RecipeOutputMetadataField]
57
+ recipe_output_metadata_fields: list[recipe_output_metadata_t.RecipeOutputMetadataField]
59
58
  # DO NOT MODIFY -- This file is generated by type_spec