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