UncountablePythonSDK 0.0.82__py3-none-any.whl → 0.0.132__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 (298) 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/basic_auth.py +7 -0
  9. examples/create_ingredient_sdk.py +34 -0
  10. examples/download_files.py +26 -0
  11. examples/integration-server/jobs/materials_auto/concurrent_cron.py +11 -0
  12. examples/integration-server/jobs/materials_auto/example_cron.py +3 -0
  13. examples/integration-server/jobs/materials_auto/example_http.py +47 -0
  14. examples/integration-server/jobs/materials_auto/example_instrument.py +100 -0
  15. examples/integration-server/jobs/materials_auto/example_parse.py +140 -0
  16. examples/integration-server/jobs/materials_auto/example_predictions.py +61 -0
  17. examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +39 -0
  18. examples/integration-server/jobs/materials_auto/example_wh.py +17 -9
  19. examples/integration-server/jobs/materials_auto/profile.yaml +61 -0
  20. examples/integration-server/pyproject.toml +10 -10
  21. examples/oauth.py +7 -0
  22. examples/set_recipe_metadata_file.py +1 -1
  23. examples/upload_files.py +1 -2
  24. pkgs/argument_parser/__init__.py +8 -0
  25. pkgs/argument_parser/_is_namedtuple.py +3 -0
  26. pkgs/argument_parser/argument_parser.py +196 -63
  27. pkgs/filesystem_utils/__init__.py +1 -0
  28. pkgs/filesystem_utils/_blob_session.py +144 -0
  29. pkgs/filesystem_utils/_gdrive_session.py +5 -5
  30. pkgs/filesystem_utils/_s3_session.py +2 -1
  31. pkgs/filesystem_utils/_sftp_session.py +6 -3
  32. pkgs/filesystem_utils/file_type_utils.py +30 -10
  33. pkgs/serialization/__init__.py +7 -2
  34. pkgs/serialization/annotation.py +64 -0
  35. pkgs/serialization/missing_sentry.py +1 -1
  36. pkgs/serialization/opaque_key.py +1 -1
  37. pkgs/serialization/serial_alias.py +47 -0
  38. pkgs/serialization/serial_class.py +40 -48
  39. pkgs/serialization/serial_generic.py +16 -0
  40. pkgs/serialization/serial_union.py +16 -16
  41. pkgs/serialization_util/__init__.py +6 -0
  42. pkgs/serialization_util/dataclasses.py +14 -0
  43. pkgs/serialization_util/serialization_helpers.py +15 -5
  44. pkgs/type_spec/actions_registry/__main__.py +0 -4
  45. pkgs/type_spec/actions_registry/emit_typescript.py +2 -4
  46. pkgs/type_spec/builder.py +248 -70
  47. pkgs/type_spec/builder_types.py +9 -0
  48. pkgs/type_spec/config.py +40 -7
  49. pkgs/type_spec/cross_output_links.py +99 -0
  50. pkgs/type_spec/emit_open_api.py +121 -34
  51. pkgs/type_spec/emit_open_api_util.py +5 -5
  52. pkgs/type_spec/emit_python.py +277 -86
  53. pkgs/type_spec/emit_typescript.py +102 -29
  54. pkgs/type_spec/emit_typescript_util.py +66 -10
  55. pkgs/type_spec/load_types.py +16 -3
  56. pkgs/type_spec/non_discriminated_union_exceptions.py +14 -0
  57. pkgs/type_spec/open_api_util.py +29 -4
  58. pkgs/type_spec/parts/base.py.prepart +11 -8
  59. pkgs/type_spec/parts/base.ts.prepart +4 -0
  60. pkgs/type_spec/type_info/__main__.py +3 -1
  61. pkgs/type_spec/type_info/emit_type_info.py +115 -22
  62. pkgs/type_spec/ui_entry_actions/__init__.py +4 -0
  63. pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +308 -0
  64. pkgs/type_spec/util.py +3 -3
  65. pkgs/type_spec/value_spec/__main__.py +26 -9
  66. pkgs/type_spec/value_spec/convert_type.py +18 -0
  67. pkgs/type_spec/value_spec/emit_python.py +13 -3
  68. pkgs/type_spec/value_spec/types.py +1 -1
  69. uncountable/core/async_batch.py +1 -1
  70. uncountable/core/client.py +133 -34
  71. uncountable/core/environment.py +3 -3
  72. uncountable/core/file_upload.py +39 -15
  73. uncountable/integration/cli.py +116 -23
  74. uncountable/integration/construct_client.py +3 -3
  75. uncountable/integration/executors/executors.py +12 -2
  76. uncountable/integration/executors/generic_upload_executor.py +66 -14
  77. uncountable/integration/http_server/__init__.py +5 -0
  78. uncountable/integration/http_server/types.py +69 -0
  79. uncountable/integration/job.py +192 -7
  80. uncountable/integration/queue_runner/command_server/__init__.py +4 -0
  81. uncountable/integration/queue_runner/command_server/command_client.py +65 -0
  82. uncountable/integration/queue_runner/command_server/command_server.py +83 -5
  83. uncountable/integration/queue_runner/command_server/constants.py +4 -0
  84. uncountable/integration/queue_runner/command_server/protocol/command_server.proto +36 -0
  85. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +28 -11
  86. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +77 -1
  87. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +135 -0
  88. uncountable/integration/queue_runner/command_server/types.py +25 -2
  89. uncountable/integration/queue_runner/datastore/datastore_sqlite.py +168 -11
  90. uncountable/integration/queue_runner/datastore/interface.py +10 -0
  91. uncountable/integration/queue_runner/datastore/model.py +8 -1
  92. uncountable/integration/queue_runner/job_scheduler.py +63 -23
  93. uncountable/integration/queue_runner/queue_runner.py +10 -2
  94. uncountable/integration/queue_runner/worker.py +22 -17
  95. uncountable/integration/scan_profiles.py +1 -1
  96. uncountable/integration/scheduler.py +74 -25
  97. uncountable/integration/secret_retrieval/retrieve_secret.py +1 -1
  98. uncountable/integration/server.py +42 -12
  99. uncountable/integration/telemetry.py +63 -10
  100. uncountable/integration/webhook_server/entrypoint.py +39 -112
  101. uncountable/types/__init__.py +58 -1
  102. uncountable/types/api/batch/execute_batch.py +5 -6
  103. uncountable/types/api/batch/execute_batch_load_async.py +2 -3
  104. uncountable/types/api/chemical/convert_chemical_formats.py +10 -5
  105. uncountable/types/api/condition_parameters/__init__.py +1 -0
  106. uncountable/types/api/condition_parameters/upsert_condition_match.py +72 -0
  107. uncountable/types/api/entity/create_entities.py +7 -7
  108. uncountable/types/api/entity/create_entity.py +8 -8
  109. uncountable/types/api/entity/create_or_update_entity.py +48 -0
  110. uncountable/types/api/entity/export_entities.py +59 -0
  111. uncountable/types/api/entity/get_entities_data.py +3 -4
  112. uncountable/types/api/entity/grant_entity_permissions.py +6 -6
  113. uncountable/types/api/entity/list_aggregate.py +79 -0
  114. uncountable/types/api/entity/list_entities.py +34 -10
  115. uncountable/types/api/entity/lock_entity.py +4 -4
  116. uncountable/types/api/entity/lookup_entity.py +116 -0
  117. uncountable/types/api/entity/resolve_entity_ids.py +5 -6
  118. uncountable/types/api/entity/set_entity_field_values.py +44 -0
  119. uncountable/types/api/entity/set_values.py +3 -3
  120. uncountable/types/api/entity/transition_entity_phase.py +14 -7
  121. uncountable/types/api/entity/unlock_entity.py +3 -3
  122. uncountable/types/api/equipment/associate_equipment_input.py +2 -3
  123. uncountable/types/api/field_options/upsert_field_options.py +7 -7
  124. uncountable/types/api/files/__init__.py +1 -0
  125. uncountable/types/api/files/download_file.py +77 -0
  126. uncountable/types/api/id_source/list_id_source.py +6 -7
  127. uncountable/types/api/id_source/match_id_source.py +4 -5
  128. uncountable/types/api/input_groups/get_input_group_names.py +3 -4
  129. uncountable/types/api/inputs/create_inputs.py +10 -9
  130. uncountable/types/api/inputs/get_input_data.py +11 -12
  131. uncountable/types/api/inputs/get_input_names.py +6 -7
  132. uncountable/types/api/inputs/get_inputs_data.py +6 -7
  133. uncountable/types/api/inputs/set_input_attribute_values.py +5 -6
  134. uncountable/types/api/inputs/set_input_category.py +5 -5
  135. uncountable/types/api/inputs/set_input_subcategories.py +3 -3
  136. uncountable/types/api/inputs/set_intermediate_type.py +4 -4
  137. uncountable/types/api/integrations/__init__.py +1 -0
  138. uncountable/types/api/integrations/publish_realtime_data.py +41 -0
  139. uncountable/types/api/integrations/push_notification.py +49 -0
  140. uncountable/types/api/integrations/register_sockets_token.py +41 -0
  141. uncountable/types/api/listing/__init__.py +1 -0
  142. uncountable/types/api/listing/fetch_listing.py +58 -0
  143. uncountable/types/api/material_families/update_entity_material_families.py +3 -4
  144. uncountable/types/api/notebooks/__init__.py +1 -0
  145. uncountable/types/api/notebooks/add_notebook_content.py +119 -0
  146. uncountable/types/api/outputs/get_output_data.py +12 -13
  147. uncountable/types/api/outputs/get_output_names.py +5 -6
  148. uncountable/types/api/outputs/get_output_organization.py +173 -0
  149. uncountable/types/api/outputs/resolve_output_conditions.py +7 -8
  150. uncountable/types/api/permissions/set_core_permissions.py +16 -10
  151. uncountable/types/api/project/get_projects.py +6 -7
  152. uncountable/types/api/project/get_projects_data.py +7 -8
  153. uncountable/types/api/recipe_links/create_recipe_link.py +5 -5
  154. uncountable/types/api/recipe_links/remove_recipe_link.py +4 -4
  155. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +6 -7
  156. uncountable/types/api/recipes/add_recipe_to_project.py +3 -3
  157. uncountable/types/api/recipes/add_time_series_data.py +64 -0
  158. uncountable/types/api/recipes/archive_recipes.py +4 -4
  159. uncountable/types/api/recipes/associate_recipe_as_input.py +5 -5
  160. uncountable/types/api/recipes/associate_recipe_as_lot.py +3 -3
  161. uncountable/types/api/recipes/clear_recipe_outputs.py +3 -3
  162. uncountable/types/api/recipes/create_mix_order.py +44 -0
  163. uncountable/types/api/recipes/create_recipe.py +8 -9
  164. uncountable/types/api/recipes/create_recipes.py +8 -9
  165. uncountable/types/api/recipes/disassociate_recipe_as_input.py +3 -3
  166. uncountable/types/api/recipes/edit_recipe_inputs.py +101 -24
  167. uncountable/types/api/recipes/get_column_calculation_values.py +4 -5
  168. uncountable/types/api/recipes/get_curve.py +4 -5
  169. uncountable/types/api/recipes/get_recipe_calculations.py +6 -7
  170. uncountable/types/api/recipes/get_recipe_links.py +3 -4
  171. uncountable/types/api/recipes/get_recipe_names.py +3 -4
  172. uncountable/types/api/recipes/get_recipe_output_metadata.py +5 -6
  173. uncountable/types/api/recipes/get_recipes_data.py +62 -34
  174. uncountable/types/api/recipes/lock_recipes.py +9 -8
  175. uncountable/types/api/recipes/remove_recipe_from_project.py +3 -3
  176. uncountable/types/api/recipes/set_recipe_inputs.py +9 -10
  177. uncountable/types/api/recipes/set_recipe_metadata.py +3 -3
  178. uncountable/types/api/recipes/set_recipe_output_annotations.py +11 -12
  179. uncountable/types/api/recipes/set_recipe_output_file.py +5 -6
  180. uncountable/types/api/recipes/set_recipe_outputs.py +24 -13
  181. uncountable/types/api/recipes/set_recipe_tags.py +14 -9
  182. uncountable/types/api/recipes/set_recipe_total.py +59 -0
  183. uncountable/types/api/recipes/unarchive_recipes.py +3 -3
  184. uncountable/types/api/recipes/unlock_recipes.py +7 -6
  185. uncountable/types/api/runsheet/__init__.py +1 -0
  186. uncountable/types/api/runsheet/complete_async_upload.py +41 -0
  187. uncountable/types/api/triggers/run_trigger.py +4 -4
  188. uncountable/types/api/uploader/complete_async_parse.py +46 -0
  189. uncountable/types/api/uploader/invoke_uploader.py +4 -5
  190. uncountable/types/api/user/__init__.py +1 -0
  191. uncountable/types/api/user/get_current_user_info.py +40 -0
  192. uncountable/types/async_batch.py +1 -1
  193. uncountable/types/async_batch_processor.py +506 -23
  194. uncountable/types/async_batch_t.py +35 -8
  195. uncountable/types/async_jobs.py +0 -1
  196. uncountable/types/async_jobs_t.py +1 -2
  197. uncountable/types/auth_retrieval.py +0 -1
  198. uncountable/types/auth_retrieval_t.py +6 -6
  199. uncountable/types/base.py +0 -1
  200. uncountable/types/base_t.py +11 -9
  201. uncountable/types/calculations.py +0 -1
  202. uncountable/types/calculations_t.py +1 -2
  203. uncountable/types/chemical_structure.py +0 -1
  204. uncountable/types/chemical_structure_t.py +5 -5
  205. uncountable/types/client_base.py +614 -69
  206. uncountable/types/client_config.py +1 -1
  207. uncountable/types/client_config_t.py +13 -3
  208. uncountable/types/curves.py +0 -1
  209. uncountable/types/curves_t.py +6 -7
  210. uncountable/types/data.py +12 -0
  211. uncountable/types/data_t.py +103 -0
  212. uncountable/types/entity.py +1 -1
  213. uncountable/types/entity_t.py +90 -10
  214. uncountable/types/experiment_groups.py +0 -1
  215. uncountable/types/experiment_groups_t.py +1 -2
  216. uncountable/types/exports.py +8 -0
  217. uncountable/types/exports_t.py +34 -0
  218. uncountable/types/field_values.py +19 -1
  219. uncountable/types/field_values_t.py +242 -9
  220. uncountable/types/fields.py +0 -1
  221. uncountable/types/fields_t.py +1 -2
  222. uncountable/types/generic_upload.py +0 -1
  223. uncountable/types/generic_upload_t.py +14 -14
  224. uncountable/types/id_source.py +0 -1
  225. uncountable/types/id_source_t.py +13 -7
  226. uncountable/types/identifier.py +0 -1
  227. uncountable/types/identifier_t.py +10 -5
  228. uncountable/types/input_attributes.py +0 -1
  229. uncountable/types/input_attributes_t.py +3 -4
  230. uncountable/types/inputs.py +0 -1
  231. uncountable/types/inputs_t.py +3 -4
  232. uncountable/types/integration_server.py +0 -1
  233. uncountable/types/integration_server_t.py +13 -4
  234. uncountable/types/integration_session.py +10 -0
  235. uncountable/types/integration_session_t.py +60 -0
  236. uncountable/types/integrations.py +10 -0
  237. uncountable/types/integrations_t.py +62 -0
  238. uncountable/types/job_definition.py +2 -1
  239. uncountable/types/job_definition_t.py +57 -32
  240. uncountable/types/listing.py +9 -0
  241. uncountable/types/listing_t.py +51 -0
  242. uncountable/types/notices.py +8 -0
  243. uncountable/types/notices_t.py +37 -0
  244. uncountable/types/notifications.py +11 -0
  245. uncountable/types/notifications_t.py +74 -0
  246. uncountable/types/outputs.py +0 -1
  247. uncountable/types/outputs_t.py +2 -3
  248. uncountable/types/overrides.py +0 -1
  249. uncountable/types/overrides_t.py +10 -4
  250. uncountable/types/permissions.py +0 -1
  251. uncountable/types/permissions_t.py +1 -2
  252. uncountable/types/phases.py +0 -1
  253. uncountable/types/phases_t.py +1 -2
  254. uncountable/types/post_base.py +0 -1
  255. uncountable/types/post_base_t.py +1 -2
  256. uncountable/types/queued_job.py +2 -1
  257. uncountable/types/queued_job_t.py +29 -12
  258. uncountable/types/recipe_identifiers.py +0 -1
  259. uncountable/types/recipe_identifiers_t.py +18 -8
  260. uncountable/types/recipe_inputs.py +0 -1
  261. uncountable/types/recipe_inputs_t.py +1 -2
  262. uncountable/types/recipe_links.py +0 -1
  263. uncountable/types/recipe_links_t.py +3 -4
  264. uncountable/types/recipe_metadata.py +0 -1
  265. uncountable/types/recipe_metadata_t.py +9 -10
  266. uncountable/types/recipe_output_metadata.py +0 -1
  267. uncountable/types/recipe_output_metadata_t.py +1 -2
  268. uncountable/types/recipe_tags.py +0 -1
  269. uncountable/types/recipe_tags_t.py +1 -2
  270. uncountable/types/recipe_workflow_steps.py +0 -1
  271. uncountable/types/recipe_workflow_steps_t.py +7 -7
  272. uncountable/types/recipes.py +0 -1
  273. uncountable/types/recipes_t.py +2 -2
  274. uncountable/types/response.py +0 -1
  275. uncountable/types/response_t.py +2 -2
  276. uncountable/types/secret_retrieval.py +0 -1
  277. uncountable/types/secret_retrieval_t.py +7 -7
  278. uncountable/types/sockets.py +20 -0
  279. uncountable/types/sockets_t.py +169 -0
  280. uncountable/types/structured_filters.py +25 -0
  281. uncountable/types/structured_filters_t.py +248 -0
  282. uncountable/types/units.py +0 -1
  283. uncountable/types/units_t.py +1 -2
  284. uncountable/types/uploader.py +24 -0
  285. uncountable/types/uploader_t.py +222 -0
  286. uncountable/types/users.py +0 -1
  287. uncountable/types/users_t.py +1 -2
  288. uncountable/types/webhook_job.py +1 -1
  289. uncountable/types/webhook_job_t.py +14 -3
  290. uncountable/types/workflows.py +0 -1
  291. uncountable/types/workflows_t.py +3 -4
  292. uncountablepythonsdk-0.0.132.dist-info/METADATA +64 -0
  293. uncountablepythonsdk-0.0.132.dist-info/RECORD +363 -0
  294. {UncountablePythonSDK-0.0.82.dist-info → uncountablepythonsdk-0.0.132.dist-info}/WHEEL +1 -1
  295. UncountablePythonSDK-0.0.82.dist-info/METADATA +0 -60
  296. UncountablePythonSDK-0.0.82.dist-info/RECORD +0 -292
  297. docs/quickstart.md +0 -19
  298. {UncountablePythonSDK-0.0.82.dist-info → uncountablepythonsdk-0.0.132.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
@@ -7,8 +6,10 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
10
  import dataclasses
11
11
  from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_string_enum
12
13
  from ... import base_t
13
14
  from ... import experiment_groups_t
14
15
  from ... import inputs_t
@@ -25,7 +26,9 @@ __all__: list[str] = [
25
26
  "ENDPOINT_PATH",
26
27
  "Recipe",
27
28
  "RecipeInput",
29
+ "RecipeLockStatus",
28
30
  "RecipeOutput",
31
+ "RecipeOutputInclusion",
29
32
  "RecipeStep",
30
33
  "RecipeStepGroup",
31
34
  "RecipeStepRelationship",
@@ -41,12 +44,25 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipes_data"
41
44
  @serial_class(
42
45
  named_type_path="sdk.api.recipes.get_recipes_data.Arguments",
43
46
  )
44
- @dataclasses.dataclass(kw_only=True)
47
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
45
48
  class Arguments:
46
- recipe_ids: typing.Optional[typing.Optional[list[base_t.ObjectId]]] = None
47
- project_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None
48
- offset: typing.Optional[typing.Optional[int]] = None
49
- limit: typing.Optional[typing.Optional[int]] = None
49
+ recipe_ids: list[base_t.ObjectId] | None = None
50
+ project_id: base_t.ObjectId | None = None
51
+ offset: int | None = None
52
+ limit: int | None = None
53
+ empty_output_behavior: RecipeOutputInclusion | None = None
54
+
55
+
56
+ # DO NOT MODIFY -- This file is generated by type_spec
57
+ @serial_string_enum(
58
+ labels={
59
+ "include_null": "Include Outputs without values",
60
+ "exclude_null": "Exclude Outputs without values",
61
+ },
62
+ )
63
+ class RecipeOutputInclusion(StrEnum):
64
+ INCLUDE_NULL = "include_null"
65
+ EXCLUDE_NULL = "exclude_null"
50
66
 
51
67
 
52
68
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -55,15 +71,15 @@ class Arguments:
55
71
  unconverted_values={"quantity_json"},
56
72
  to_string_values={"quantity_dec"},
57
73
  )
58
- @dataclasses.dataclass(kw_only=True)
74
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
59
75
  class RecipeOutput:
60
76
  id: base_t.ObjectId
61
77
  output_id: base_t.ObjectId
62
78
  replicate_num: int
63
79
  quantity_json: base_t.JsonValue
64
- curve_id: typing.Optional[base_t.ObjectId]
65
- output_condition_id: typing.Optional[base_t.ObjectId]
66
- quantity_dec: typing.Optional[Decimal] = None
80
+ curve_id: base_t.ObjectId | None
81
+ output_condition_id: base_t.ObjectId | None
82
+ quantity_dec: Decimal | None = None
67
83
 
68
84
 
69
85
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -72,19 +88,19 @@ class RecipeOutput:
72
88
  unconverted_values={"quantity_json"},
73
89
  to_string_values={"quantity_dec"},
74
90
  )
75
- @dataclasses.dataclass(kw_only=True)
91
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
76
92
  class ConditionParameterValue:
77
93
  condition_parameter_id: base_t.ObjectId
78
94
  condition_parameter_name: str
79
95
  quantity_json: base_t.JsonValue
80
- quantity_dec: typing.Optional[Decimal] = None
96
+ quantity_dec: Decimal | None = None
81
97
 
82
98
 
83
99
  # DO NOT MODIFY -- This file is generated by type_spec
84
100
  @serial_class(
85
101
  named_type_path="sdk.api.recipes.get_recipes_data.SimpleOutputCondition",
86
102
  )
87
- @dataclasses.dataclass(kw_only=True)
103
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
88
104
  class SimpleOutputCondition:
89
105
  output_condition_id: base_t.ObjectId
90
106
  condition_parameter_values: list[ConditionParameterValue]
@@ -96,40 +112,40 @@ class SimpleOutputCondition:
96
112
  unconverted_values={"actual_quantity_json", "quantity_json"},
97
113
  to_string_values={"actual_quantity_dec", "quantity_dec"},
98
114
  )
99
- @dataclasses.dataclass(kw_only=True)
115
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
100
116
  class RecipeInput:
101
117
  id: base_t.ObjectId
102
118
  input_id: base_t.ObjectId
103
- input_lot_recipe_id: typing.Optional[base_t.ObjectId]
119
+ input_lot_recipe_id: base_t.ObjectId | None
104
120
  recipe_step_id: base_t.ObjectId
105
121
  quantity_json: base_t.JsonValue
106
- curve_id: typing.Optional[base_t.ObjectId]
122
+ curve_id: base_t.ObjectId | None
107
123
  actual_quantity_json: base_t.JsonValue
108
124
  behavior: str
109
- ingredient_role_id: typing.Optional[base_t.ObjectId]
110
- quantity_dec: typing.Optional[Decimal] = None
111
- actual_quantity_dec: typing.Optional[Decimal] = None
125
+ ingredient_role_id: base_t.ObjectId | None
126
+ quantity_dec: Decimal | None = None
127
+ actual_quantity_dec: Decimal | None = None
112
128
 
113
129
 
114
130
  # DO NOT MODIFY -- This file is generated by type_spec
115
131
  @serial_class(
116
132
  named_type_path="sdk.api.recipes.get_recipes_data.RecipeStep",
117
133
  )
118
- @dataclasses.dataclass(kw_only=True)
134
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
119
135
  class RecipeStep:
120
- name: typing.Optional[str]
136
+ name: str | None
121
137
  recipe_step_id: base_t.ObjectId
122
138
  recipe_step_number: int
123
- instructions: typing.Optional[str] = None
139
+ instructions: str | None = None
124
140
 
125
141
 
126
142
  # DO NOT MODIFY -- This file is generated by type_spec
127
143
  @serial_class(
128
144
  named_type_path="sdk.api.recipes.get_recipes_data.RecipeStepGroup",
129
145
  )
130
- @dataclasses.dataclass(kw_only=True)
146
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
131
147
  class RecipeStepGroup:
132
- name: typing.Optional[str]
148
+ name: str | None
133
149
  recipe_steps: list[RecipeStep]
134
150
 
135
151
 
@@ -137,8 +153,9 @@ class RecipeStepGroup:
137
153
  @serial_class(
138
154
  named_type_path="sdk.api.recipes.get_recipes_data.RecipeWorkflowStep",
139
155
  )
140
- @dataclasses.dataclass(kw_only=True)
156
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
141
157
  class RecipeWorkflowStep:
158
+ recipe_workflow_step_name: str | None
142
159
  recipe_workflow_step_id: base_t.ObjectId
143
160
  workflow_step_id: base_t.ObjectId
144
161
  recipe_step_groups: list[RecipeStepGroup]
@@ -149,27 +166,37 @@ class RecipeWorkflowStep:
149
166
  named_type_path="sdk.api.recipes.get_recipes_data.RecipeStepRelationship",
150
167
  to_string_values={"actual_quantity_dec", "quantity_dec"},
151
168
  )
152
- @dataclasses.dataclass(kw_only=True)
169
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
153
170
  class RecipeStepRelationship:
154
171
  step_relationship_id: base_t.ObjectId
155
- name: typing.Optional[str]
172
+ name: str | None
156
173
  source_recipe_workflow_step_id: base_t.ObjectId
157
174
  target_recipe_step_id: base_t.ObjectId
158
- quantity_dec: typing.Optional[Decimal] = None
159
- actual_quantity_dec: typing.Optional[Decimal] = None
175
+ quantity_dec: Decimal | None = None
176
+ actual_quantity_dec: Decimal | None = None
177
+
178
+
179
+ # DO NOT MODIFY -- This file is generated by type_spec
180
+ @serial_class(
181
+ named_type_path="sdk.api.recipes.get_recipes_data.RecipeLockStatus",
182
+ )
183
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
184
+ class RecipeLockStatus:
185
+ has_locked_inputs: bool
186
+ has_locked_outputs: bool
160
187
 
161
188
 
162
189
  # DO NOT MODIFY -- This file is generated by type_spec
163
190
  @serial_class(
164
191
  named_type_path="sdk.api.recipes.get_recipes_data.Recipe",
165
192
  )
166
- @dataclasses.dataclass(kw_only=True)
193
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
167
194
  class Recipe:
168
195
  recipe_id: base_t.ObjectId
169
196
  create_datetime: str
170
197
  last_modified_datetime: str
171
198
  name: str
172
- notes: typing.Optional[str]
199
+ notes: str | None
173
200
  workflow_id: base_t.ObjectId
174
201
  metadata: list[recipe_metadata_t.RecipeMetadata]
175
202
  inputs: list[RecipeInput]
@@ -178,15 +205,16 @@ class Recipe:
178
205
  tag_ids: list[base_t.ObjectId]
179
206
  experiment_group_ids: list[base_t.ObjectId]
180
207
  step_relationships: list[RecipeStepRelationship]
181
- creating_user_id: typing.Optional[base_t.ObjectId] = None
182
- barcode_value: typing.Optional[str] = None
208
+ recipe_lock_status: RecipeLockStatus
209
+ creating_user_id: base_t.ObjectId | None = None
210
+ barcode_value: str | None = None
183
211
 
184
212
 
185
213
  # DO NOT MODIFY -- This file is generated by type_spec
186
214
  @serial_class(
187
215
  named_type_path="sdk.api.recipes.get_recipes_data.Data",
188
216
  )
189
- @dataclasses.dataclass(kw_only=True)
217
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
190
218
  class Data:
191
219
  recipes: list[Recipe]
192
220
  workflows: list[workflows_t.SimpleWorkflow]
@@ -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,9 +6,11 @@ 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
12
+ from ... import async_batch_t
13
+ from ... import base_t
13
14
  from ... import identifier_t
14
15
 
15
16
  __all__: list[str] = [
@@ -35,7 +36,7 @@ class RecipeLockType(StrEnum):
35
36
  @serial_class(
36
37
  named_type_path="sdk.api.recipes.lock_recipes.RecipeLockBase",
37
38
  )
38
- @dataclasses.dataclass(kw_only=True)
39
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
39
40
  class RecipeLockBase:
40
41
  recipe: identifier_t.IdentifierKey
41
42
 
@@ -44,20 +45,20 @@ class RecipeLockBase:
44
45
  @serial_class(
45
46
  named_type_path="sdk.api.recipes.lock_recipes.Arguments",
46
47
  )
47
- @dataclasses.dataclass(kw_only=True)
48
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
48
49
  class Arguments:
49
50
  type: RecipeLockType = RecipeLockType.ALL
50
51
  recipes: list[identifier_t.IdentifierKey]
51
52
  globally_removable: bool
52
- lock_samples: typing.Optional[bool] = None
53
- comments: typing.Optional[str] = None
53
+ lock_samples: bool | None = None
54
+ comments: str | None = None
54
55
 
55
56
 
56
57
  # DO NOT MODIFY -- This file is generated by type_spec
57
58
  @serial_class(
58
59
  named_type_path="sdk.api.recipes.lock_recipes.Data",
59
60
  )
60
- @dataclasses.dataclass(kw_only=True)
61
- class Data:
61
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
62
+ class Data(async_batch_t.AsyncBatchActionReturn):
62
63
  pass
63
64
  # 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
@@ -9,6 +8,7 @@ import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
9
  import dataclasses
11
10
  from pkgs.serialization import serial_class
11
+ from ... import base_t
12
12
  from ... import identifier_t
13
13
 
14
14
  __all__: list[str] = [
@@ -26,7 +26,7 @@ ENDPOINT_PATH = "api/external/recipes/remove_recipe_from_project"
26
26
  @serial_class(
27
27
  named_type_path="sdk.api.recipes.remove_recipe_from_project.Arguments",
28
28
  )
29
- @dataclasses.dataclass(kw_only=True)
29
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
30
30
  class Arguments:
31
31
  recipe_key: identifier_t.IdentifierKey
32
32
  project_key: identifier_t.IdentifierKey
@@ -36,7 +36,7 @@ class Arguments:
36
36
  @serial_class(
37
37
  named_type_path="sdk.api.recipes.remove_recipe_from_project.Data",
38
38
  )
39
- @dataclasses.dataclass(kw_only=True)
39
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
40
40
  class Data:
41
41
  pass
42
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
@@ -28,23 +27,23 @@ ENDPOINT_PATH = "api/external/recipes/external_set_recipe_inputs"
28
27
  named_type_path="sdk.api.recipes.set_recipe_inputs.RecipeInputValue",
29
28
  to_string_values={"value_numeric"},
30
29
  )
31
- @dataclasses.dataclass(kw_only=True)
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
31
  class RecipeInputValue:
33
32
  recipe_id: base_t.ObjectId
34
33
  input_id: base_t.ObjectId
35
- recipe_step_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None
36
- value_numeric: typing.Optional[Decimal] = None
37
- value_str: typing.Optional[str] = None
38
- set_actual_value: typing.Optional[bool] = None
39
- lot_recipe_id: typing.Optional[base_t.ObjectId] = None
40
- remove: typing.Optional[bool] = None
34
+ recipe_step_id: base_t.ObjectId | None = None
35
+ value_numeric: Decimal | None = None
36
+ value_str: str | None = None
37
+ set_actual_value: bool | None = None
38
+ lot_recipe_id: base_t.ObjectId | None = None
39
+ remove: bool | None = None
41
40
 
42
41
 
43
42
  # DO NOT MODIFY -- This file is generated by type_spec
44
43
  @serial_class(
45
44
  named_type_path="sdk.api.recipes.set_recipe_inputs.Arguments",
46
45
  )
47
- @dataclasses.dataclass(kw_only=True)
46
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
48
47
  class Arguments:
49
48
  input_data: list[RecipeInputValue]
50
49
 
@@ -53,7 +52,7 @@ class Arguments:
53
52
  @serial_class(
54
53
  named_type_path="sdk.api.recipes.set_recipe_inputs.Data",
55
54
  )
56
- @dataclasses.dataclass(kw_only=True)
55
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
57
56
  class Data:
58
57
  pass
59
58
  # 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
@@ -9,6 +8,7 @@ import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
9
  import dataclasses
11
10
  from pkgs.serialization import serial_class
11
+ from ... import base_t
12
12
  from ... import identifier_t
13
13
  from ... import recipe_metadata_t
14
14
 
@@ -27,7 +27,7 @@ ENDPOINT_PATH = "api/external/recipes/set_recipe_metadata"
27
27
  @serial_class(
28
28
  named_type_path="sdk.api.recipes.set_recipe_metadata.Arguments",
29
29
  )
30
- @dataclasses.dataclass(kw_only=True)
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
31
  class Arguments:
32
32
  recipe_key: identifier_t.IdentifierKey
33
33
  recipe_metadata: list[recipe_metadata_t.MetadataValue]
@@ -37,7 +37,7 @@ class Arguments:
37
37
  @serial_class(
38
38
  named_type_path="sdk.api.recipes.set_recipe_metadata.Data",
39
39
  )
40
- @dataclasses.dataclass(kw_only=True)
40
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
41
  class Data:
42
42
  pass
43
43
  # 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,7 +6,7 @@ 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
@@ -36,11 +35,11 @@ ENDPOINT_PATH = "api/external/recipes/set_recipe_output_annotations"
36
35
  named_type_path="sdk.api.recipes.set_recipe_output_annotations.AnnotationEdit",
37
36
  to_string_values={"lower_value", "upper_value"},
38
37
  )
39
- @dataclasses.dataclass(kw_only=True)
38
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
40
39
  class AnnotationEdit:
41
40
  annotation_type_key: identifier_t.IdentifierKey
42
- lower_value: typing.Optional[Decimal] = None
43
- upper_value: typing.Optional[Decimal] = None
41
+ lower_value: Decimal | None = None
42
+ upper_value: Decimal | None = None
44
43
 
45
44
 
46
45
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -53,13 +52,13 @@ class AnnotationUpdateType(StrEnum):
53
52
  @serial_class(
54
53
  named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputEditBase",
55
54
  )
56
- @dataclasses.dataclass(kw_only=True)
55
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
57
56
  class RecipeOutputEditBase:
58
57
  recipe_id: base_t.ObjectId
59
58
  output_id: base_t.ObjectId
60
59
  experiment_num: int
61
60
  annotations: list[AnnotationEdit]
62
- condition_id: typing.Optional[base_t.ObjectId] = None
61
+ condition_id: base_t.ObjectId | None = None
63
62
 
64
63
 
65
64
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -67,7 +66,7 @@ class RecipeOutputEditBase:
67
66
  named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputMergeAnnotations",
68
67
  parse_require={"type"},
69
68
  )
70
- @dataclasses.dataclass(kw_only=True)
69
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
71
70
  class RecipeOutputMergeAnnotations(RecipeOutputEditBase):
72
71
  type: typing.Literal[AnnotationUpdateType.MERGE] = AnnotationUpdateType.MERGE
73
72
 
@@ -77,14 +76,14 @@ class RecipeOutputMergeAnnotations(RecipeOutputEditBase):
77
76
  named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputReplaceAnnotations",
78
77
  parse_require={"type"},
79
78
  )
80
- @dataclasses.dataclass(kw_only=True)
79
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
81
80
  class RecipeOutputReplaceAnnotations(RecipeOutputEditBase):
82
81
  type: typing.Literal[AnnotationUpdateType.REPLACE] = AnnotationUpdateType.REPLACE
83
82
 
84
83
 
85
84
  # DO NOT MODIFY -- This file is generated by type_spec
86
85
  RecipeOutputUpdateAnnotations = typing.Annotated[
87
- typing.Union[RecipeOutputMergeAnnotations, RecipeOutputReplaceAnnotations],
86
+ RecipeOutputMergeAnnotations | RecipeOutputReplaceAnnotations,
88
87
  serial_union_annotation(
89
88
  named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputUpdateAnnotations",
90
89
  discriminator="type",
@@ -100,7 +99,7 @@ RecipeOutputUpdateAnnotations = typing.Annotated[
100
99
  @serial_class(
101
100
  named_type_path="sdk.api.recipes.set_recipe_output_annotations.Arguments",
102
101
  )
103
- @dataclasses.dataclass(kw_only=True)
102
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
104
103
  class Arguments:
105
104
  updates: list[RecipeOutputUpdateAnnotations]
106
105
 
@@ -109,7 +108,7 @@ class Arguments:
109
108
  @serial_class(
110
109
  named_type_path="sdk.api.recipes.set_recipe_output_annotations.Data",
111
110
  )
112
- @dataclasses.dataclass(kw_only=True)
111
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
113
112
  class Data:
114
113
  pass
115
114
  # 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
@@ -28,20 +27,20 @@ ENDPOINT_PATH = "api/external/recipes/external_set_recipe_output_file"
28
27
  @serial_class(
29
28
  named_type_path="sdk.api.recipes.set_recipe_output_file.RecipeOutputFileValue",
30
29
  )
31
- @dataclasses.dataclass(kw_only=True)
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
31
  class RecipeOutputFileValue:
33
32
  recipe_id: base_t.ObjectId
34
33
  output_id: base_t.ObjectId
35
34
  experiment_num: int
36
- condition_id: typing.Optional[base_t.ObjectId] = None
37
- file_id: typing.Optional[base_t.ObjectId] = None
35
+ condition_id: base_t.ObjectId | None = None
36
+ file_id: base_t.ObjectId | None = None
38
37
 
39
38
 
40
39
  # DO NOT MODIFY -- This file is generated by type_spec
41
40
  @serial_class(
42
41
  named_type_path="sdk.api.recipes.set_recipe_output_file.Arguments",
43
42
  )
44
- @dataclasses.dataclass(kw_only=True)
43
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
45
44
  class Arguments:
46
45
  output_file_data: RecipeOutputFileValue
47
46
 
@@ -50,7 +49,7 @@ class Arguments:
50
49
  @serial_class(
51
50
  named_type_path="sdk.api.recipes.set_recipe_output_file.Data",
52
51
  )
53
- @dataclasses.dataclass(kw_only=True)
52
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
54
53
  class Data(response_t.Response):
55
54
  pass
56
55
  # 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,9 +6,11 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
10
  import dataclasses
11
11
  from pkgs.serialization import serial_class
12
12
  from ... import base_t
13
+ from ... import data_t
13
14
  from ... import field_values_t
14
15
  from ... import recipes_t
15
16
  from ... import response_t
@@ -20,6 +21,7 @@ __all__: list[str] = [
20
21
  "Data",
21
22
  "ENDPOINT_METHOD",
22
23
  "ENDPOINT_PATH",
24
+ "NullBehavior",
23
25
  "RecipeOutputValue",
24
26
  ]
25
27
 
@@ -31,10 +33,16 @@ ENDPOINT_PATH = "api/external/recipes/external_set_recipe_outputs"
31
33
  @serial_class(
32
34
  named_type_path="sdk.api.recipes.set_recipe_outputs.CurveValues",
33
35
  )
34
- @dataclasses.dataclass(kw_only=True)
36
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
35
37
  class CurveValues:
36
- x_values: list[typing.Optional[Decimal]]
37
- y_values: list[typing.Optional[Decimal]]
38
+ x_values: list[Decimal | None]
39
+ y_values: list[Decimal | None]
40
+
41
+
42
+ # DO NOT MODIFY -- This file is generated by type_spec
43
+ class NullBehavior(StrEnum):
44
+ DO_NOTHING = "do_nothing"
45
+ ENSURE_EXISTS = "ensure_exists"
38
46
 
39
47
 
40
48
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -42,24 +50,27 @@ class CurveValues:
42
50
  named_type_path="sdk.api.recipes.set_recipe_outputs.RecipeOutputValue",
43
51
  to_string_values={"value_numeric"},
44
52
  )
45
- @dataclasses.dataclass(kw_only=True)
53
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
46
54
  class RecipeOutputValue:
47
55
  recipe_id: base_t.ObjectId
48
56
  output_id: base_t.ObjectId
49
57
  experiment_num: int
50
- condition_id: typing.Optional[base_t.ObjectId] = None
51
- value_numeric: typing.Optional[Decimal] = None
52
- value_str: typing.Optional[str] = None
53
- value_curve: typing.Optional[CurveValues] = None
54
- formatting: typing.Optional[recipes_t.RecipeAttributeFormatting] = None
55
- field_values: typing.Optional[list[typing.Union[field_values_t.ArgumentValueRefName, field_values_t.ArgumentValueId]]] = None
58
+ null_behavior: NullBehavior | None = NullBehavior.DO_NOTHING
59
+ condition_id: base_t.ObjectId | None = None
60
+ value_numeric: Decimal | None = None
61
+ value_str: str | None = None
62
+ value_curve: CurveValues | None = None
63
+ value_color: data_t.SupportedColorFormatColor | None = None
64
+ value_ingredient_id: base_t.ObjectId | None = None
65
+ formatting: recipes_t.RecipeAttributeFormatting | None = None
66
+ field_values: list[field_values_t.ArgumentValueRefName | field_values_t.ArgumentValueId] | None = None
56
67
 
57
68
 
58
69
  # DO NOT MODIFY -- This file is generated by type_spec
59
70
  @serial_class(
60
71
  named_type_path="sdk.api.recipes.set_recipe_outputs.Arguments",
61
72
  )
62
- @dataclasses.dataclass(kw_only=True)
73
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
63
74
  class Arguments:
64
75
  output_data: list[RecipeOutputValue]
65
76
 
@@ -68,7 +79,7 @@ class Arguments:
68
79
  @serial_class(
69
80
  named_type_path="sdk.api.recipes.set_recipe_outputs.Data",
70
81
  )
71
- @dataclasses.dataclass(kw_only=True)
82
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
72
83
  class Data(response_t.Response):
73
84
  pass
74
85
  # DO NOT MODIFY -- This file is generated by type_spec