UncountablePythonSDK 0.0.52__py3-none-any.whl → 0.0.131__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of UncountablePythonSDK might be problematic. Click here for more details.

Files changed (316) hide show
  1. docs/conf.py +54 -7
  2. docs/index.md +107 -4
  3. docs/integration_examples/create_ingredient.md +43 -0
  4. docs/integration_examples/create_output.md +56 -0
  5. docs/integration_examples/index.md +6 -0
  6. docs/justfile +2 -2
  7. docs/requirements.txt +6 -4
  8. examples/async_batch.py +3 -3
  9. examples/basic_auth.py +7 -0
  10. examples/create_entity.py +3 -1
  11. examples/create_ingredient_sdk.py +34 -0
  12. examples/download_files.py +26 -0
  13. examples/edit_recipe_inputs.py +4 -2
  14. examples/integration-server/jobs/materials_auto/concurrent_cron.py +11 -0
  15. examples/integration-server/jobs/materials_auto/example_cron.py +21 -0
  16. examples/integration-server/jobs/materials_auto/example_http.py +47 -0
  17. examples/integration-server/jobs/materials_auto/example_instrument.py +100 -0
  18. examples/integration-server/jobs/materials_auto/example_parse.py +140 -0
  19. examples/integration-server/jobs/materials_auto/example_predictions.py +61 -0
  20. examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +39 -0
  21. examples/integration-server/jobs/materials_auto/example_wh.py +23 -0
  22. examples/integration-server/jobs/materials_auto/profile.yaml +104 -0
  23. examples/integration-server/pyproject.toml +224 -0
  24. examples/invoke_uploader.py +4 -1
  25. examples/oauth.py +7 -0
  26. examples/set_recipe_metadata_file.py +40 -0
  27. examples/set_recipe_output_file_sdk.py +26 -0
  28. examples/upload_files.py +1 -2
  29. pkgs/argument_parser/__init__.py +9 -0
  30. pkgs/argument_parser/_is_namedtuple.py +3 -0
  31. pkgs/argument_parser/argument_parser.py +217 -70
  32. pkgs/filesystem_utils/__init__.py +1 -0
  33. pkgs/filesystem_utils/_blob_session.py +144 -0
  34. pkgs/filesystem_utils/_gdrive_session.py +10 -7
  35. pkgs/filesystem_utils/_s3_session.py +15 -13
  36. pkgs/filesystem_utils/_sftp_session.py +11 -7
  37. pkgs/filesystem_utils/file_type_utils.py +30 -10
  38. pkgs/py.typed +0 -0
  39. pkgs/serialization/__init__.py +7 -2
  40. pkgs/serialization/annotation.py +64 -0
  41. pkgs/serialization/missing_sentry.py +1 -1
  42. pkgs/serialization/opaque_key.py +1 -1
  43. pkgs/serialization/serial_alias.py +47 -0
  44. pkgs/serialization/serial_class.py +47 -26
  45. pkgs/serialization/serial_generic.py +16 -0
  46. pkgs/serialization/serial_union.py +17 -14
  47. pkgs/serialization/yaml.py +4 -1
  48. pkgs/serialization_util/__init__.py +6 -0
  49. pkgs/serialization_util/dataclasses.py +14 -0
  50. pkgs/serialization_util/serialization_helpers.py +15 -5
  51. pkgs/type_spec/actions_registry/__main__.py +0 -4
  52. pkgs/type_spec/actions_registry/emit_typescript.py +5 -5
  53. pkgs/type_spec/builder.py +354 -119
  54. pkgs/type_spec/builder_types.py +9 -0
  55. pkgs/type_spec/config.py +51 -11
  56. pkgs/type_spec/cross_output_links.py +99 -0
  57. pkgs/type_spec/emit_io_ts.py +1 -1
  58. pkgs/type_spec/emit_open_api.py +127 -36
  59. pkgs/type_spec/emit_open_api_util.py +5 -6
  60. pkgs/type_spec/emit_python.py +329 -121
  61. pkgs/type_spec/emit_typescript.py +117 -256
  62. pkgs/type_spec/emit_typescript_util.py +291 -2
  63. pkgs/type_spec/load_types.py +18 -4
  64. pkgs/type_spec/non_discriminated_union_exceptions.py +14 -0
  65. pkgs/type_spec/open_api_util.py +29 -4
  66. pkgs/type_spec/parts/base.py.prepart +13 -10
  67. pkgs/type_spec/parts/base.ts.prepart +4 -0
  68. pkgs/type_spec/type_info/__main__.py +3 -1
  69. pkgs/type_spec/type_info/emit_type_info.py +124 -29
  70. pkgs/type_spec/ui_entry_actions/__init__.py +4 -0
  71. pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +308 -0
  72. pkgs/type_spec/util.py +4 -4
  73. pkgs/type_spec/value_spec/__main__.py +26 -9
  74. pkgs/type_spec/value_spec/convert_type.py +21 -1
  75. pkgs/type_spec/value_spec/emit_python.py +25 -7
  76. pkgs/type_spec/value_spec/types.py +1 -1
  77. uncountable/core/async_batch.py +1 -1
  78. uncountable/core/client.py +142 -39
  79. uncountable/core/environment.py +41 -0
  80. uncountable/core/file_upload.py +52 -18
  81. uncountable/integration/cli.py +142 -0
  82. uncountable/integration/construct_client.py +8 -8
  83. uncountable/integration/cron.py +11 -37
  84. uncountable/integration/db/connect.py +12 -2
  85. uncountable/integration/db/session.py +25 -0
  86. uncountable/integration/entrypoint.py +8 -37
  87. uncountable/integration/executors/executors.py +125 -2
  88. uncountable/integration/executors/generic_upload_executor.py +87 -29
  89. uncountable/integration/executors/script_executor.py +3 -3
  90. uncountable/integration/http_server/__init__.py +5 -0
  91. uncountable/integration/http_server/types.py +69 -0
  92. uncountable/integration/job.py +242 -12
  93. uncountable/integration/queue_runner/__init__.py +0 -0
  94. uncountable/integration/queue_runner/command_server/__init__.py +28 -0
  95. uncountable/integration/queue_runner/command_server/command_client.py +133 -0
  96. uncountable/integration/queue_runner/command_server/command_server.py +142 -0
  97. uncountable/integration/queue_runner/command_server/constants.py +4 -0
  98. uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  99. uncountable/integration/queue_runner/command_server/protocol/command_server.proto +58 -0
  100. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +57 -0
  101. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +114 -0
  102. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +264 -0
  103. uncountable/integration/queue_runner/command_server/types.py +75 -0
  104. uncountable/integration/queue_runner/datastore/__init__.py +3 -0
  105. uncountable/integration/queue_runner/datastore/datastore_sqlite.py +250 -0
  106. uncountable/integration/queue_runner/datastore/interface.py +29 -0
  107. uncountable/integration/queue_runner/datastore/model.py +24 -0
  108. uncountable/integration/queue_runner/job_scheduler.py +200 -0
  109. uncountable/integration/queue_runner/queue_runner.py +34 -0
  110. uncountable/integration/queue_runner/types.py +7 -0
  111. uncountable/integration/queue_runner/worker.py +116 -0
  112. uncountable/integration/scan_profiles.py +67 -0
  113. uncountable/integration/scheduler.py +199 -0
  114. uncountable/integration/secret_retrieval/retrieve_secret.py +26 -4
  115. uncountable/integration/server.py +94 -69
  116. uncountable/integration/telemetry.py +150 -34
  117. uncountable/integration/webhook_server/entrypoint.py +97 -0
  118. uncountable/types/__init__.py +78 -1
  119. uncountable/types/api/batch/execute_batch.py +13 -6
  120. uncountable/types/api/batch/execute_batch_load_async.py +9 -3
  121. uncountable/types/api/chemical/convert_chemical_formats.py +17 -5
  122. uncountable/types/api/condition_parameters/__init__.py +1 -0
  123. uncountable/types/api/condition_parameters/upsert_condition_match.py +72 -0
  124. uncountable/types/api/entity/create_entities.py +19 -7
  125. uncountable/types/api/entity/create_entity.py +17 -8
  126. uncountable/types/api/entity/create_or_update_entity.py +48 -0
  127. uncountable/types/api/entity/export_entities.py +59 -0
  128. uncountable/types/api/entity/get_entities_data.py +13 -4
  129. uncountable/types/api/entity/grant_entity_permissions.py +48 -0
  130. uncountable/types/api/entity/list_aggregate.py +79 -0
  131. uncountable/types/api/entity/list_entities.py +42 -10
  132. uncountable/types/api/entity/lock_entity.py +11 -4
  133. uncountable/types/api/entity/lookup_entity.py +116 -0
  134. uncountable/types/api/entity/resolve_entity_ids.py +15 -6
  135. uncountable/types/api/entity/set_entity_field_values.py +44 -0
  136. uncountable/types/api/entity/set_values.py +10 -3
  137. uncountable/types/api/entity/transition_entity_phase.py +22 -7
  138. uncountable/types/api/entity/unlock_entity.py +10 -3
  139. uncountable/types/api/equipment/associate_equipment_input.py +9 -3
  140. uncountable/types/api/field_options/upsert_field_options.py +17 -7
  141. uncountable/types/api/files/__init__.py +1 -0
  142. uncountable/types/api/files/download_file.py +77 -0
  143. uncountable/types/api/id_source/list_id_source.py +16 -7
  144. uncountable/types/api/id_source/match_id_source.py +14 -5
  145. uncountable/types/api/input_groups/get_input_group_names.py +13 -4
  146. uncountable/types/api/inputs/create_inputs.py +23 -9
  147. uncountable/types/api/inputs/get_input_data.py +30 -12
  148. uncountable/types/api/inputs/get_input_names.py +16 -7
  149. uncountable/types/api/inputs/get_inputs_data.py +25 -7
  150. uncountable/types/api/inputs/set_input_attribute_values.py +12 -6
  151. uncountable/types/api/inputs/set_input_category.py +12 -5
  152. uncountable/types/api/inputs/set_input_subcategories.py +10 -3
  153. uncountable/types/api/inputs/set_intermediate_type.py +11 -4
  154. uncountable/types/api/integrations/__init__.py +1 -0
  155. uncountable/types/api/integrations/publish_realtime_data.py +41 -0
  156. uncountable/types/api/integrations/push_notification.py +49 -0
  157. uncountable/types/api/integrations/register_sockets_token.py +41 -0
  158. uncountable/types/api/listing/__init__.py +1 -0
  159. uncountable/types/api/listing/fetch_listing.py +58 -0
  160. uncountable/types/api/material_families/update_entity_material_families.py +10 -4
  161. uncountable/types/api/notebooks/__init__.py +1 -0
  162. uncountable/types/api/notebooks/add_notebook_content.py +119 -0
  163. uncountable/types/api/outputs/get_output_data.py +28 -13
  164. uncountable/types/api/outputs/get_output_names.py +15 -6
  165. uncountable/types/api/outputs/get_output_organization.py +173 -0
  166. uncountable/types/api/outputs/resolve_output_conditions.py +20 -8
  167. uncountable/types/api/permissions/set_core_permissions.py +26 -10
  168. uncountable/types/api/project/get_projects.py +16 -7
  169. uncountable/types/api/project/get_projects_data.py +17 -8
  170. uncountable/types/api/recipe_links/create_recipe_link.py +12 -5
  171. uncountable/types/api/recipe_links/remove_recipe_link.py +11 -4
  172. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +16 -7
  173. uncountable/types/api/recipes/add_recipe_to_project.py +10 -3
  174. uncountable/types/api/recipes/add_time_series_data.py +64 -0
  175. uncountable/types/api/recipes/archive_recipes.py +11 -4
  176. uncountable/types/api/recipes/associate_recipe_as_input.py +12 -5
  177. uncountable/types/api/recipes/associate_recipe_as_lot.py +10 -3
  178. uncountable/types/api/recipes/clear_recipe_outputs.py +42 -0
  179. uncountable/types/api/recipes/create_mix_order.py +44 -0
  180. uncountable/types/api/recipes/create_recipe.py +15 -9
  181. uncountable/types/api/recipes/create_recipes.py +21 -9
  182. uncountable/types/api/recipes/disassociate_recipe_as_input.py +10 -3
  183. uncountable/types/api/recipes/edit_recipe_inputs.py +134 -22
  184. uncountable/types/api/recipes/get_column_calculation_values.py +57 -0
  185. uncountable/types/api/recipes/get_curve.py +11 -5
  186. uncountable/types/api/recipes/get_recipe_calculations.py +13 -7
  187. uncountable/types/api/recipes/get_recipe_links.py +10 -4
  188. uncountable/types/api/recipes/get_recipe_names.py +13 -4
  189. uncountable/types/api/recipes/get_recipe_output_metadata.py +12 -6
  190. uncountable/types/api/recipes/get_recipes_data.py +87 -33
  191. uncountable/types/api/recipes/lock_recipes.py +19 -8
  192. uncountable/types/api/recipes/remove_recipe_from_project.py +10 -3
  193. uncountable/types/api/recipes/set_recipe_inputs.py +16 -10
  194. uncountable/types/api/recipes/set_recipe_metadata.py +10 -3
  195. uncountable/types/api/recipes/set_recipe_output_annotations.py +24 -12
  196. uncountable/types/api/recipes/set_recipe_output_file.py +55 -0
  197. uncountable/types/api/recipes/set_recipe_outputs.py +35 -12
  198. uncountable/types/api/recipes/set_recipe_tags.py +26 -9
  199. uncountable/types/api/recipes/set_recipe_total.py +59 -0
  200. uncountable/types/api/recipes/unarchive_recipes.py +10 -3
  201. uncountable/types/api/recipes/unlock_recipes.py +14 -6
  202. uncountable/types/api/runsheet/__init__.py +1 -0
  203. uncountable/types/api/runsheet/complete_async_upload.py +41 -0
  204. uncountable/types/api/triggers/run_trigger.py +11 -4
  205. uncountable/types/api/uploader/complete_async_parse.py +46 -0
  206. uncountable/types/api/uploader/invoke_uploader.py +13 -6
  207. uncountable/types/api/user/__init__.py +1 -0
  208. uncountable/types/api/user/get_current_user_info.py +40 -0
  209. uncountable/types/async_batch.py +2 -1
  210. uncountable/types/async_batch_processor.py +618 -18
  211. uncountable/types/async_batch_t.py +54 -7
  212. uncountable/types/async_jobs.py +8 -0
  213. uncountable/types/async_jobs_t.py +52 -0
  214. uncountable/types/auth_retrieval.py +11 -0
  215. uncountable/types/auth_retrieval_t.py +75 -0
  216. uncountable/types/base.py +0 -1
  217. uncountable/types/base_t.py +13 -11
  218. uncountable/types/calculations.py +0 -1
  219. uncountable/types/calculations_t.py +5 -2
  220. uncountable/types/chemical_structure.py +0 -1
  221. uncountable/types/chemical_structure_t.py +6 -5
  222. uncountable/types/client_base.py +751 -70
  223. uncountable/types/client_config.py +1 -1
  224. uncountable/types/client_config_t.py +17 -3
  225. uncountable/types/curves.py +0 -1
  226. uncountable/types/curves_t.py +10 -7
  227. uncountable/types/data.py +12 -0
  228. uncountable/types/data_t.py +103 -0
  229. uncountable/types/entity.py +4 -1
  230. uncountable/types/entity_t.py +125 -7
  231. uncountable/types/experiment_groups.py +0 -1
  232. uncountable/types/experiment_groups_t.py +5 -2
  233. uncountable/types/exports.py +8 -0
  234. uncountable/types/exports_t.py +34 -0
  235. uncountable/types/field_values.py +19 -1
  236. uncountable/types/field_values_t.py +246 -9
  237. uncountable/types/fields.py +0 -1
  238. uncountable/types/fields_t.py +5 -2
  239. uncountable/types/generic_upload.py +6 -1
  240. uncountable/types/generic_upload_t.py +88 -9
  241. uncountable/types/id_source.py +0 -1
  242. uncountable/types/id_source_t.py +26 -7
  243. uncountable/types/identifier.py +0 -1
  244. uncountable/types/identifier_t.py +13 -5
  245. uncountable/types/input_attributes.py +0 -1
  246. uncountable/types/input_attributes_t.py +4 -4
  247. uncountable/types/inputs.py +1 -1
  248. uncountable/types/inputs_t.py +24 -4
  249. uncountable/types/integration_server.py +8 -0
  250. uncountable/types/integration_server_t.py +46 -0
  251. uncountable/types/integration_session.py +10 -0
  252. uncountable/types/integration_session_t.py +60 -0
  253. uncountable/types/integrations.py +10 -0
  254. uncountable/types/integrations_t.py +62 -0
  255. uncountable/types/job_definition.py +4 -6
  256. uncountable/types/job_definition_t.py +96 -65
  257. uncountable/types/listing.py +9 -0
  258. uncountable/types/listing_t.py +51 -0
  259. uncountable/types/notices.py +8 -0
  260. uncountable/types/notices_t.py +37 -0
  261. uncountable/types/notifications.py +11 -0
  262. uncountable/types/notifications_t.py +74 -0
  263. uncountable/types/outputs.py +0 -1
  264. uncountable/types/outputs_t.py +6 -3
  265. uncountable/types/overrides.py +9 -0
  266. uncountable/types/overrides_t.py +49 -0
  267. uncountable/types/permissions.py +0 -1
  268. uncountable/types/permissions_t.py +1 -2
  269. uncountable/types/phases.py +0 -1
  270. uncountable/types/phases_t.py +5 -2
  271. uncountable/types/post_base.py +0 -1
  272. uncountable/types/post_base_t.py +1 -2
  273. uncountable/types/queued_job.py +17 -0
  274. uncountable/types/queued_job_t.py +140 -0
  275. uncountable/types/recipe_identifiers.py +0 -1
  276. uncountable/types/recipe_identifiers_t.py +21 -8
  277. uncountable/types/recipe_inputs.py +0 -1
  278. uncountable/types/recipe_inputs_t.py +1 -2
  279. uncountable/types/recipe_links.py +0 -1
  280. uncountable/types/recipe_links_t.py +7 -4
  281. uncountable/types/recipe_metadata.py +0 -1
  282. uncountable/types/recipe_metadata_t.py +14 -9
  283. uncountable/types/recipe_output_metadata.py +0 -1
  284. uncountable/types/recipe_output_metadata_t.py +5 -2
  285. uncountable/types/recipe_tags.py +0 -1
  286. uncountable/types/recipe_tags_t.py +5 -2
  287. uncountable/types/recipe_workflow_steps.py +0 -1
  288. uncountable/types/recipe_workflow_steps_t.py +14 -7
  289. uncountable/types/recipes.py +0 -1
  290. uncountable/types/recipes_t.py +6 -2
  291. uncountable/types/response.py +0 -1
  292. uncountable/types/response_t.py +3 -2
  293. uncountable/types/secret_retrieval.py +0 -1
  294. uncountable/types/secret_retrieval_t.py +13 -7
  295. uncountable/types/sockets.py +20 -0
  296. uncountable/types/sockets_t.py +169 -0
  297. uncountable/types/structured_filters.py +25 -0
  298. uncountable/types/structured_filters_t.py +248 -0
  299. uncountable/types/units.py +0 -1
  300. uncountable/types/units_t.py +5 -2
  301. uncountable/types/uploader.py +24 -0
  302. uncountable/types/uploader_t.py +222 -0
  303. uncountable/types/users.py +0 -1
  304. uncountable/types/users_t.py +5 -2
  305. uncountable/types/webhook_job.py +9 -0
  306. uncountable/types/webhook_job_t.py +48 -0
  307. uncountable/types/workflows.py +0 -1
  308. uncountable/types/workflows_t.py +10 -4
  309. uncountablepythonsdk-0.0.131.dist-info/METADATA +64 -0
  310. uncountablepythonsdk-0.0.131.dist-info/RECORD +363 -0
  311. {UncountablePythonSDK-0.0.52.dist-info → uncountablepythonsdk-0.0.131.dist-info}/WHEEL +1 -1
  312. UncountablePythonSDK-0.0.52.dist-info/METADATA +0 -56
  313. UncountablePythonSDK-0.0.52.dist-info/RECORD +0 -246
  314. docs/quickstart.md +0 -19
  315. uncountable/core/version.py +0 -11
  316. {UncountablePythonSDK-0.0.52.dist-info → uncountablepythonsdk-0.0.131.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -8,6 +7,8 @@ import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
9
  import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import base_t
11
12
  from ... import identifier_t
12
13
 
13
14
  __all__: list[str] = [
@@ -22,14 +23,20 @@ ENDPOINT_PATH = "api/external/recipes/archive"
22
23
 
23
24
 
24
25
  # DO NOT MODIFY -- This file is generated by type_spec
25
- @dataclasses.dataclass(kw_only=True)
26
+ @serial_class(
27
+ named_type_path="sdk.api.recipes.archive_recipes.Arguments",
28
+ )
29
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
26
30
  class Arguments:
27
31
  recipes: list[identifier_t.IdentifierKey]
28
- reason: typing.Optional[str] = None
32
+ reason: str | None = None
29
33
 
30
34
 
31
35
  # DO NOT MODIFY -- This file is generated by type_spec
32
- @dataclasses.dataclass(kw_only=True)
36
+ @serial_class(
37
+ named_type_path="sdk.api.recipes.archive_recipes.Data",
38
+ )
39
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
33
40
  class Data:
34
41
  pass
35
42
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -8,7 +7,9 @@ import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
9
  import dataclasses
10
+ from pkgs.serialization import serial_class
11
11
  from ... import async_batch_t
12
+ from ... import base_t
12
13
  from ... import identifier_t
13
14
 
14
15
  __all__: list[str] = [
@@ -23,15 +24,21 @@ ENDPOINT_PATH = "api/external/recipes/associate_recipe_as_input"
23
24
 
24
25
 
25
26
  # DO NOT MODIFY -- This file is generated by type_spec
26
- @dataclasses.dataclass(kw_only=True)
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.associate_recipe_as_input.Arguments",
29
+ )
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
27
31
  class Arguments:
28
32
  recipe_key: identifier_t.IdentifierKey
29
- input_key: typing.Optional[identifier_t.IdentifierKey] = None
30
- show_in_listings: typing.Optional[bool] = None
33
+ input_key: identifier_t.IdentifierKey | None = None
34
+ show_in_listings: bool | None = None
31
35
 
32
36
 
33
37
  # DO NOT MODIFY -- This file is generated by type_spec
34
- @dataclasses.dataclass(kw_only=True)
38
+ @serial_class(
39
+ named_type_path="sdk.api.recipes.associate_recipe_as_input.Data",
40
+ )
41
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
35
42
  class Data(async_batch_t.AsyncBatchActionReturn):
36
43
  pass
37
44
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -8,7 +7,9 @@ import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
9
  import dataclasses
10
+ from pkgs.serialization import serial_class
11
11
  from ... import async_batch_t
12
+ from ... import base_t
12
13
  from ... import identifier_t
13
14
 
14
15
  __all__: list[str] = [
@@ -23,14 +24,20 @@ ENDPOINT_PATH = "api/external/recipes/associate_recipe_as_lot"
23
24
 
24
25
 
25
26
  # DO NOT MODIFY -- This file is generated by type_spec
26
- @dataclasses.dataclass(kw_only=True)
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.associate_recipe_as_lot.Arguments",
29
+ )
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
27
31
  class Arguments:
28
32
  recipe_key: identifier_t.IdentifierKey
29
33
  ingredient_key: identifier_t.IdentifierKey
30
34
 
31
35
 
32
36
  # DO NOT MODIFY -- This file is generated by type_spec
33
- @dataclasses.dataclass(kw_only=True)
37
+ @serial_class(
38
+ named_type_path="sdk.api.recipes.associate_recipe_as_lot.Data",
39
+ )
40
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
34
41
  class Data(async_batch_t.AsyncBatchActionReturn):
35
42
  pass
36
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
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
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
+ ]
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(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
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(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
40
+ class Data(async_batch_t.AsyncBatchActionReturn):
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
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
12
+ from ... import base_t
13
+ from ... import identifier_t
14
+ from ... import recipe_workflow_steps_t
15
+
16
+ __all__: list[str] = [
17
+ "Arguments",
18
+ "Data",
19
+ "ENDPOINT_METHOD",
20
+ "ENDPOINT_PATH",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "POST"
24
+ ENDPOINT_PATH = "api/external/recipes/create_mix_order"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.create_mix_order.Arguments",
30
+ )
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
+ class Arguments:
33
+ recipe_key: identifier_t.IdentifierKey
34
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier
35
+
36
+
37
+ # DO NOT MODIFY -- This file is generated by type_spec
38
+ @serial_class(
39
+ named_type_path="sdk.api.recipes.create_mix_order.Data",
40
+ )
41
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
42
+ class Data(async_batch_t.AsyncBatchActionReturn):
43
+ pass
44
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -8,6 +7,7 @@ import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
9
  import dataclasses
10
+ from pkgs.serialization import serial_class
11
11
  from ... import base_t
12
12
  from ... import identifier_t
13
13
  from ... import recipe_identifiers_t
@@ -25,20 +25,26 @@ ENDPOINT_PATH = "api/external/recipes/create_recipe"
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
- @dataclasses.dataclass(kw_only=True)
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.create_recipe.Arguments",
30
+ )
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
29
32
  class Arguments:
30
33
  material_family_id: base_t.ObjectId
31
34
  workflow_id: base_t.ObjectId
32
- name: typing.Optional[str] = None
33
- project_id: typing.Optional[base_t.ObjectId] = None
34
- workflow_variant_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None
35
- recipe_metadata: typing.Optional[list[recipe_metadata_t.MetadataValue]] = None
36
- identifiers: typing.Optional[recipe_identifiers_t.RecipeIdentifiers] = None
37
- definition_key: typing.Optional[identifier_t.IdentifierKey] = None
35
+ name: str | None = None
36
+ project_id: base_t.ObjectId | None = None
37
+ workflow_variant_id: base_t.ObjectId | None = None
38
+ recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None
39
+ identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None
40
+ definition_key: identifier_t.IdentifierKey | None = None
38
41
 
39
42
 
40
43
  # DO NOT MODIFY -- This file is generated by type_spec
41
- @dataclasses.dataclass(kw_only=True)
44
+ @serial_class(
45
+ named_type_path="sdk.api.recipes.create_recipe.Data",
46
+ )
47
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
42
48
  class Data:
43
49
  result_id: base_t.ObjectId
44
50
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -8,6 +7,7 @@ import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
9
  import dataclasses
10
+ from pkgs.serialization import serial_class
11
11
  from ... import base_t
12
12
  from ... import recipe_metadata_t
13
13
 
@@ -25,30 +25,42 @@ ENDPOINT_PATH = "api/external/recipes/external_create_recipes"
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
- @dataclasses.dataclass(kw_only=True)
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.create_recipes.CreateRecipeDefinition",
30
+ )
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
29
32
  class CreateRecipeDefinition:
30
33
  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
34
+ name: str | None = None
35
+ workflow_variant_id: base_t.ObjectId | None = None
36
+ recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None
34
37
 
35
38
 
36
39
  # DO NOT MODIFY -- This file is generated by type_spec
37
- @dataclasses.dataclass(kw_only=True)
40
+ @serial_class(
41
+ named_type_path="sdk.api.recipes.create_recipes.Arguments",
42
+ )
43
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
38
44
  class Arguments:
39
45
  material_family_id: base_t.ObjectId
40
46
  recipe_definitions: list[CreateRecipeDefinition]
41
- project_id: typing.Optional[base_t.ObjectId] = None
47
+ project_id: base_t.ObjectId | None = None
42
48
 
43
49
 
44
50
  # DO NOT MODIFY -- This file is generated by type_spec
45
- @dataclasses.dataclass(kw_only=True)
51
+ @serial_class(
52
+ named_type_path="sdk.api.recipes.create_recipes.CreateRecipeResult",
53
+ )
54
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
46
55
  class CreateRecipeResult:
47
56
  recipe_id: base_t.ObjectId
48
57
 
49
58
 
50
59
  # DO NOT MODIFY -- This file is generated by type_spec
51
- @dataclasses.dataclass(kw_only=True)
60
+ @serial_class(
61
+ named_type_path="sdk.api.recipes.create_recipes.Data",
62
+ )
63
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
52
64
  class Data:
53
65
  recipes: list[CreateRecipeResult]
54
66
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -8,7 +7,9 @@ import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
9
  import dataclasses
10
+ from pkgs.serialization import serial_class
11
11
  from ... import async_batch_t
12
+ from ... import base_t
12
13
  from ... import identifier_t
13
14
 
14
15
  __all__: list[str] = [
@@ -23,13 +24,19 @@ ENDPOINT_PATH = "api/external/recipes/disassociate_recipe_as_input"
23
24
 
24
25
 
25
26
  # DO NOT MODIFY -- This file is generated by type_spec
26
- @dataclasses.dataclass(kw_only=True)
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.disassociate_recipe_as_input.Arguments",
29
+ )
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
27
31
  class Arguments:
28
32
  recipe_key: identifier_t.IdentifierKey
29
33
 
30
34
 
31
35
  # DO NOT MODIFY -- This file is generated by type_spec
32
- @dataclasses.dataclass(kw_only=True)
36
+ @serial_class(
37
+ named_type_path="sdk.api.recipes.disassociate_recipe_as_input.Data",
38
+ )
39
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
33
40
  class Data(async_batch_t.AsyncBatchActionReturn):
34
41
  pass
35
42
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -7,11 +6,13 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
- from pkgs.strenum_compat import StrEnum
9
+ from enum import StrEnum
11
10
  import dataclasses
12
11
  from pkgs.serialization import serial_class
13
12
  from pkgs.serialization import serial_union_annotation
13
+ from ... import base_t
14
14
  from ... import identifier_t
15
+ from ... import inputs_t
15
16
  from ... import recipe_inputs_t
16
17
  from ... import recipe_workflow_steps_t
17
18
 
@@ -21,6 +22,10 @@ __all__: list[str] = [
21
22
  "Data",
22
23
  "ENDPOINT_METHOD",
23
24
  "ENDPOINT_PATH",
25
+ "MixStepMatchStrategy",
26
+ "PlaceholderBase",
27
+ "PlaceholderDisplayMode",
28
+ "PlaceholderType",
24
29
  "RecipeInputEdit",
25
30
  "RecipeInputEditAddInput",
26
31
  "RecipeInputEditAddInstructions",
@@ -28,10 +33,14 @@ __all__: list[str] = [
28
33
  "RecipeInputEditChangeBasisViewed",
29
34
  "RecipeInputEditClearInputs",
30
35
  "RecipeInputEditInputBase",
36
+ "RecipeInputEditPlaceholder",
31
37
  "RecipeInputEditSetLot",
38
+ "RecipeInputEditSetRole",
32
39
  "RecipeInputEditType",
33
40
  "RecipeInputEditUpdateAnnotations",
34
41
  "RecipeInputEditUpsertInput",
42
+ "RecipeInputPlaceholder",
43
+ "SubcategoryPlaceholder",
35
44
  ]
36
45
 
37
46
  ENDPOINT_METHOD = "POST"
@@ -47,81 +56,103 @@ class RecipeInputEditType(StrEnum):
47
56
  SET_LOT = "set_lot"
48
57
  CHANGE_BASIS = "change_basis"
49
58
  ADD_INSTRUCTIONS = "add_instructions"
59
+ SET_ROLE = "set_role"
60
+ SET_PLACEHOLDER = "set_placeholder"
50
61
 
51
62
 
52
63
  # DO NOT MODIFY -- This file is generated by type_spec
53
- @dataclasses.dataclass(kw_only=True)
64
+ class MixStepMatchStrategy(StrEnum):
65
+ FIRST = "first"
66
+ LAST = "last"
67
+
68
+
69
+ # DO NOT MODIFY -- This file is generated by type_spec
70
+ @serial_class(
71
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditBase",
72
+ )
73
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
54
74
  class RecipeInputEditBase:
55
75
  type: RecipeInputEditType
56
76
 
57
77
 
58
78
  # DO NOT MODIFY -- This file is generated by type_spec
59
79
  @serial_class(
80
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditClearInputs",
60
81
  parse_require={"type"},
61
82
  )
62
- @dataclasses.dataclass(kw_only=True)
83
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
63
84
  class RecipeInputEditClearInputs(RecipeInputEditBase):
64
85
  type: typing.Literal[RecipeInputEditType.CLEAR_INPUTS] = RecipeInputEditType.CLEAR_INPUTS
65
86
 
66
87
 
67
88
  # DO NOT MODIFY -- This file is generated by type_spec
68
89
  @serial_class(
90
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditInputBase",
69
91
  to_string_values={"value_numeric"},
70
92
  )
71
- @dataclasses.dataclass(kw_only=True)
93
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
72
94
  class RecipeInputEditInputBase(RecipeInputEditBase):
73
95
  ingredient_key: identifier_t.IdentifierKey
74
- quantity_basis: recipe_inputs_t.QuantityBasis = recipe_inputs_t.QuantityBasis.MASS
96
+ quantity_basis: recipe_inputs_t.QuantityBasis | None = recipe_inputs_t.QuantityBasis.MASS
75
97
  input_value_type: recipe_inputs_t.InputValueType = recipe_inputs_t.InputValueType.VALUE
76
- value_numeric: typing.Optional[Decimal] = None
77
- value_str: typing.Optional[str] = None
78
- calculation_key: typing.Optional[identifier_t.IdentifierKey] = None
98
+ value_numeric: Decimal | None = None
99
+ value_str: str | None = None
100
+ behavior: inputs_t.IngredientBehavior | None = None
101
+ calculation_key: identifier_t.IdentifierKey | None = None
79
102
 
80
103
 
81
104
  # DO NOT MODIFY -- This file is generated by type_spec
82
105
  @serial_class(
106
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditChangeBasisViewed",
83
107
  parse_require={"type"},
84
108
  )
85
- @dataclasses.dataclass(kw_only=True)
109
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
86
110
  class RecipeInputEditChangeBasisViewed(RecipeInputEditInputBase):
87
111
  type: typing.Literal[RecipeInputEditType.CHANGE_BASIS] = RecipeInputEditType.CHANGE_BASIS
112
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
88
113
 
89
114
 
90
115
  # DO NOT MODIFY -- This file is generated by type_spec
91
116
  @serial_class(
117
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditUpsertInput",
92
118
  parse_require={"type"},
93
119
  )
94
- @dataclasses.dataclass(kw_only=True)
120
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
95
121
  class RecipeInputEditUpsertInput(RecipeInputEditInputBase):
96
122
  type: typing.Literal[RecipeInputEditType.UPSERT_INPUT] = RecipeInputEditType.UPSERT_INPUT
97
123
  clear_first: bool
124
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
98
125
 
99
126
 
100
127
  # DO NOT MODIFY -- This file is generated by type_spec
101
128
  @serial_class(
129
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditAddInput",
102
130
  parse_require={"type"},
103
131
  )
104
- @dataclasses.dataclass(kw_only=True)
132
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
105
133
  class RecipeInputEditAddInput(RecipeInputEditInputBase):
106
134
  type: typing.Literal[RecipeInputEditType.ADD_INPUT] = RecipeInputEditType.ADD_INPUT
107
135
 
108
136
 
109
137
  # DO NOT MODIFY -- This file is generated by type_spec
110
138
  @serial_class(
139
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditSetLot",
111
140
  parse_require={"type"},
112
141
  )
113
- @dataclasses.dataclass(kw_only=True)
142
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
114
143
  class RecipeInputEditSetLot(RecipeInputEditBase):
115
144
  type: typing.Literal[RecipeInputEditType.SET_LOT] = RecipeInputEditType.SET_LOT
116
145
  ingredient_key: identifier_t.IdentifierKey
117
146
  ingredient_lot_recipe_key: identifier_t.IdentifierKey
147
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
118
148
 
119
149
 
120
150
  # DO NOT MODIFY -- This file is generated by type_spec
121
151
  @serial_class(
152
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditAddInstructions",
122
153
  parse_require={"type"},
123
154
  )
124
- @dataclasses.dataclass(kw_only=True)
155
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
125
156
  class RecipeInputEditAddInstructions(RecipeInputEditBase):
126
157
  type: typing.Literal[RecipeInputEditType.ADD_INSTRUCTIONS] = RecipeInputEditType.ADD_INSTRUCTIONS
127
158
  instructions: str
@@ -129,31 +160,104 @@ class RecipeInputEditAddInstructions(RecipeInputEditBase):
129
160
 
130
161
  # DO NOT MODIFY -- This file is generated by type_spec
131
162
  @serial_class(
163
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.AnnotationEdit",
132
164
  to_string_values={"lower_value", "upper_value"},
133
165
  )
134
- @dataclasses.dataclass(kw_only=True)
166
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
135
167
  class AnnotationEdit:
136
168
  annotation_type_key: identifier_t.IdentifierKey
137
- lower_value: typing.Optional[Decimal] = None
138
- upper_value: typing.Optional[Decimal] = None
169
+ lower_value: Decimal | None = None
170
+ upper_value: Decimal | None = None
139
171
 
140
172
 
141
173
  # DO NOT MODIFY -- This file is generated by type_spec
142
174
  @serial_class(
175
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditUpdateAnnotations",
143
176
  parse_require={"type"},
144
177
  )
145
- @dataclasses.dataclass(kw_only=True)
178
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
146
179
  class RecipeInputEditUpdateAnnotations(RecipeInputEditInputBase):
147
180
  type: typing.Literal[RecipeInputEditType.UPDATE_ANNOTATIONS] = RecipeInputEditType.UPDATE_ANNOTATIONS
148
- ingredient_key: identifier_t.IdentifierKey
149
181
  clear_first: bool
150
182
  annotations: list[AnnotationEdit]
183
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
184
+
185
+
186
+ # DO NOT MODIFY -- This file is generated by type_spec
187
+ @serial_class(
188
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditSetRole",
189
+ parse_require={"type"},
190
+ )
191
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
192
+ class RecipeInputEditSetRole(RecipeInputEditBase):
193
+ type: typing.Literal[RecipeInputEditType.SET_ROLE] = RecipeInputEditType.SET_ROLE
194
+ ingredient_key: identifier_t.IdentifierKey
195
+ ingredient_role_key: identifier_t.IdentifierKey | None
196
+
197
+
198
+ # DO NOT MODIFY -- This file is generated by type_spec
199
+ class PlaceholderType(StrEnum):
200
+ SUBCATEGORY = "subcategory"
201
+
202
+
203
+ # DO NOT MODIFY -- This file is generated by type_spec
204
+ class PlaceholderDisplayMode(StrEnum):
205
+ INLINE = "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.PlaceholderBase",
211
+ )
212
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
213
+ class PlaceholderBase:
214
+ type: PlaceholderType
215
+ require_for_creation: bool = True
216
+ display_mode: PlaceholderDisplayMode = PlaceholderDisplayMode.INLINE
217
+
218
+
219
+ # DO NOT MODIFY -- This file is generated by type_spec
220
+ @serial_class(
221
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.SubcategoryPlaceholder",
222
+ parse_require={"type"},
223
+ )
224
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
225
+ class SubcategoryPlaceholder(PlaceholderBase):
226
+ type: typing.Literal[PlaceholderType.SUBCATEGORY] = PlaceholderType.SUBCATEGORY
227
+ subcategory_identifier: identifier_t.IdentifierKey
228
+
229
+
230
+ # DO NOT MODIFY -- This file is generated by type_spec
231
+ RecipeInputPlaceholder = typing.Annotated[
232
+ typing.Union[SubcategoryPlaceholder],
233
+ serial_union_annotation(
234
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputPlaceholder",
235
+ discriminator="type",
236
+ discriminator_map={
237
+ "subcategory": SubcategoryPlaceholder,
238
+ },
239
+ ),
240
+ ]
241
+
242
+
243
+ # DO NOT MODIFY -- This file is generated by type_spec
244
+ @serial_class(
245
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditPlaceholder",
246
+ parse_require={"type"},
247
+ )
248
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
249
+ class RecipeInputEditPlaceholder(RecipeInputEditBase):
250
+ type: typing.Literal[RecipeInputEditType.SET_PLACEHOLDER] = RecipeInputEditType.SET_PLACEHOLDER
251
+ ingredient_key: identifier_t.IdentifierKey
252
+ placeholder: RecipeInputPlaceholder
253
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
151
254
 
152
255
 
153
256
  # DO NOT MODIFY -- This file is generated by type_spec
154
257
  RecipeInputEdit = typing.Annotated[
155
- typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations, RecipeInputEditSetLot, RecipeInputEditChangeBasisViewed, RecipeInputEditAddInstructions],
258
+ RecipeInputEditClearInputs | RecipeInputEditUpsertInput | RecipeInputEditAddInput | RecipeInputEditUpdateAnnotations | RecipeInputEditSetLot | RecipeInputEditChangeBasisViewed | RecipeInputEditAddInstructions | RecipeInputEditSetRole | RecipeInputEditPlaceholder,
156
259
  serial_union_annotation(
260
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEdit",
157
261
  discriminator="type",
158
262
  discriminator_map={
159
263
  "clear_inputs": RecipeInputEditClearInputs,
@@ -163,13 +267,18 @@ RecipeInputEdit = typing.Annotated[
163
267
  "set_lot": RecipeInputEditSetLot,
164
268
  "change_basis": RecipeInputEditChangeBasisViewed,
165
269
  "add_instructions": RecipeInputEditAddInstructions,
270
+ "set_role": RecipeInputEditSetRole,
271
+ "set_placeholder": RecipeInputEditPlaceholder,
166
272
  },
167
273
  ),
168
274
  ]
169
275
 
170
276
 
171
277
  # DO NOT MODIFY -- This file is generated by type_spec
172
- @dataclasses.dataclass(kw_only=True)
278
+ @serial_class(
279
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.Arguments",
280
+ )
281
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
173
282
  class Arguments:
174
283
  recipe_key: identifier_t.IdentifierKey
175
284
  recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier
@@ -177,7 +286,10 @@ class Arguments:
177
286
 
178
287
 
179
288
  # DO NOT MODIFY -- This file is generated by type_spec
180
- @dataclasses.dataclass(kw_only=True)
289
+ @serial_class(
290
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.Data",
291
+ )
292
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
181
293
  class Data:
182
294
  pass
183
295
  # DO NOT MODIFY -- This file is generated by type_spec