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,22 +1,22 @@
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
+ from enum import StrEnum
10
+ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
- from ... import base as base_t
13
- from ... import experiment_groups as experiment_groups_t
14
- from ... import inputs as inputs_t
15
- from ... import outputs as outputs_t
16
- from ... import recipe_metadata as recipe_metadata_t
17
- from ... import recipe_tags as recipe_tags_t
18
- from ... import users as users_t
19
- from ... import workflows as workflows_t
12
+ from pkgs.serialization import serial_string_enum
13
+ from ... import base_t
14
+ from ... import experiment_groups_t
15
+ from ... import inputs_t
16
+ from ... import outputs_t
17
+ from ... import recipe_metadata_t
18
+ from ... import recipe_tags_t
19
+ from ... import workflows_t
20
20
 
21
21
  __all__: list[str] = [
22
22
  "Arguments",
@@ -26,7 +26,9 @@ __all__: list[str] = [
26
26
  "ENDPOINT_PATH",
27
27
  "Recipe",
28
28
  "RecipeInput",
29
+ "RecipeLockStatus",
29
30
  "RecipeOutput",
31
+ "RecipeOutputInclusion",
30
32
  "RecipeStep",
31
33
  "RecipeStepGroup",
32
34
  "RecipeStepRelationship",
@@ -39,45 +41,66 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipes_data"
39
41
 
40
42
 
41
43
  # DO NOT MODIFY -- This file is generated by type_spec
42
- @dataclass(kw_only=True)
44
+ @serial_class(
45
+ named_type_path="sdk.api.recipes.get_recipes_data.Arguments",
46
+ )
47
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
43
48
  class Arguments:
44
- recipe_ids: typing.Optional[typing.Optional[list[base_t.ObjectId]]] = None
45
- project_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None
46
- offset: typing.Optional[typing.Optional[int]] = None
47
- 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"
48
66
 
49
67
 
50
68
  # DO NOT MODIFY -- This file is generated by type_spec
51
69
  @serial_class(
70
+ named_type_path="sdk.api.recipes.get_recipes_data.RecipeOutput",
52
71
  unconverted_values={"quantity_json"},
53
72
  to_string_values={"quantity_dec"},
54
73
  )
55
- @dataclass(kw_only=True)
74
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
56
75
  class RecipeOutput:
57
76
  id: base_t.ObjectId
58
77
  output_id: base_t.ObjectId
59
78
  replicate_num: int
60
- quantity_dec: Decimal
61
79
  quantity_json: base_t.JsonValue
62
- curve_id: base_t.ObjectId
63
- output_condition_id: base_t.ObjectId
80
+ curve_id: base_t.ObjectId | None
81
+ output_condition_id: base_t.ObjectId | None
82
+ quantity_dec: Decimal | None = None
64
83
 
65
84
 
66
85
  # DO NOT MODIFY -- This file is generated by type_spec
67
86
  @serial_class(
87
+ named_type_path="sdk.api.recipes.get_recipes_data.ConditionParameterValue",
68
88
  unconverted_values={"quantity_json"},
69
89
  to_string_values={"quantity_dec"},
70
90
  )
71
- @dataclass(kw_only=True)
91
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
72
92
  class ConditionParameterValue:
73
93
  condition_parameter_id: base_t.ObjectId
74
94
  condition_parameter_name: str
75
- quantity_dec: Decimal
76
95
  quantity_json: base_t.JsonValue
96
+ quantity_dec: Decimal | None = None
77
97
 
78
98
 
79
99
  # DO NOT MODIFY -- This file is generated by type_spec
80
- @dataclass(kw_only=True)
100
+ @serial_class(
101
+ named_type_path="sdk.api.recipes.get_recipes_data.SimpleOutputCondition",
102
+ )
103
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
81
104
  class SimpleOutputCondition:
82
105
  output_condition_id: base_t.ObjectId
83
106
  condition_parameter_values: list[ConditionParameterValue]
@@ -85,43 +108,54 @@ class SimpleOutputCondition:
85
108
 
86
109
  # DO NOT MODIFY -- This file is generated by type_spec
87
110
  @serial_class(
111
+ named_type_path="sdk.api.recipes.get_recipes_data.RecipeInput",
88
112
  unconverted_values={"actual_quantity_json", "quantity_json"},
89
113
  to_string_values={"actual_quantity_dec", "quantity_dec"},
90
114
  )
91
- @dataclass(kw_only=True)
115
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
92
116
  class RecipeInput:
93
117
  id: base_t.ObjectId
94
118
  input_id: base_t.ObjectId
95
- input_lot_recipe_id: typing.Optional[base_t.ObjectId]
119
+ input_lot_recipe_id: base_t.ObjectId | None
96
120
  recipe_step_id: base_t.ObjectId
97
- quantity_dec: Decimal
98
121
  quantity_json: base_t.JsonValue
99
- curve_id: typing.Optional[base_t.ObjectId]
100
- actual_quantity_dec: Decimal
122
+ curve_id: base_t.ObjectId | None
101
123
  actual_quantity_json: base_t.JsonValue
102
- input_type: str
103
124
  behavior: str
125
+ ingredient_role_id: base_t.ObjectId | None
126
+ quantity_dec: Decimal | None = None
127
+ actual_quantity_dec: Decimal | None = None
104
128
 
105
129
 
106
130
  # DO NOT MODIFY -- This file is generated by type_spec
107
- @dataclass(kw_only=True)
131
+ @serial_class(
132
+ named_type_path="sdk.api.recipes.get_recipes_data.RecipeStep",
133
+ )
134
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
108
135
  class RecipeStep:
109
- name: typing.Optional[str]
136
+ name: str | None
110
137
  recipe_step_id: base_t.ObjectId
111
138
  recipe_step_number: int
112
- instructions: typing.Optional[str] = None
139
+ instructions: str | None = None
113
140
 
114
141
 
115
142
  # DO NOT MODIFY -- This file is generated by type_spec
116
- @dataclass(kw_only=True)
143
+ @serial_class(
144
+ named_type_path="sdk.api.recipes.get_recipes_data.RecipeStepGroup",
145
+ )
146
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
117
147
  class RecipeStepGroup:
118
- name: typing.Optional[str]
148
+ name: str | None
119
149
  recipe_steps: list[RecipeStep]
120
150
 
121
151
 
122
152
  # DO NOT MODIFY -- This file is generated by type_spec
123
- @dataclass(kw_only=True)
153
+ @serial_class(
154
+ named_type_path="sdk.api.recipes.get_recipes_data.RecipeWorkflowStep",
155
+ )
156
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
124
157
  class RecipeWorkflowStep:
158
+ recipe_workflow_step_name: str | None
125
159
  recipe_workflow_step_id: base_t.ObjectId
126
160
  workflow_step_id: base_t.ObjectId
127
161
  recipe_step_groups: list[RecipeStepGroup]
@@ -129,26 +163,40 @@ class RecipeWorkflowStep:
129
163
 
130
164
  # DO NOT MODIFY -- This file is generated by type_spec
131
165
  @serial_class(
166
+ named_type_path="sdk.api.recipes.get_recipes_data.RecipeStepRelationship",
132
167
  to_string_values={"actual_quantity_dec", "quantity_dec"},
133
168
  )
134
- @dataclass(kw_only=True)
169
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
135
170
  class RecipeStepRelationship:
136
171
  step_relationship_id: base_t.ObjectId
137
- name: typing.Optional[str]
172
+ name: str | None
138
173
  source_recipe_workflow_step_id: base_t.ObjectId
139
174
  target_recipe_step_id: base_t.ObjectId
140
- quantity_dec: typing.Optional[Decimal] = None
141
- 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
142
187
 
143
188
 
144
189
  # DO NOT MODIFY -- This file is generated by type_spec
145
- @dataclass(kw_only=True)
190
+ @serial_class(
191
+ named_type_path="sdk.api.recipes.get_recipes_data.Recipe",
192
+ )
193
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
146
194
  class Recipe:
147
195
  recipe_id: base_t.ObjectId
148
196
  create_datetime: str
149
197
  last_modified_datetime: str
150
198
  name: str
151
- notes: typing.Optional[str]
199
+ notes: str | None
152
200
  workflow_id: base_t.ObjectId
153
201
  metadata: list[recipe_metadata_t.RecipeMetadata]
154
202
  inputs: list[RecipeInput]
@@ -157,12 +205,16 @@ class Recipe:
157
205
  tag_ids: list[base_t.ObjectId]
158
206
  experiment_group_ids: list[base_t.ObjectId]
159
207
  step_relationships: list[RecipeStepRelationship]
160
- creating_user_id: typing.Optional[base_t.ObjectId] = None
161
- 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
162
211
 
163
212
 
164
213
  # DO NOT MODIFY -- This file is generated by type_spec
165
- @dataclass(kw_only=True)
214
+ @serial_class(
215
+ named_type_path="sdk.api.recipes.get_recipes_data.Data",
216
+ )
217
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
166
218
  class Data:
167
219
  recipes: list[Recipe]
168
220
  workflows: list[workflows_t.SimpleWorkflow]
@@ -170,7 +222,6 @@ class Data:
170
222
  inputs: list[inputs_t.SimpleInput]
171
223
  outputs: list[outputs_t.SimpleOutput]
172
224
  output_conditions: list[SimpleOutputCondition]
173
- users: list[users_t.SimpleUser]
174
225
  recipe_tags: list[recipe_tags_t.SimpleRecipeTag]
175
226
  experiment_groups: list[experiment_groups_t.SimpleExperimentGroup]
176
227
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,64 @@
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
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import async_batch_t
13
+ from ... import base_t
14
+ from ... import identifier_t
15
+
16
+ __all__: list[str] = [
17
+ "Arguments",
18
+ "Data",
19
+ "ENDPOINT_METHOD",
20
+ "ENDPOINT_PATH",
21
+ "RecipeLockBase",
22
+ "RecipeLockType",
23
+ ]
24
+
25
+ ENDPOINT_METHOD = "POST"
26
+ ENDPOINT_PATH = "api/external/recipes/lock_recipes"
27
+
28
+
29
+ # DO NOT MODIFY -- This file is generated by type_spec
30
+ class RecipeLockType(StrEnum):
31
+ ALL = "all"
32
+ INPUTS_ONLY = "inputs_only"
33
+
34
+
35
+ # DO NOT MODIFY -- This file is generated by type_spec
36
+ @serial_class(
37
+ named_type_path="sdk.api.recipes.lock_recipes.RecipeLockBase",
38
+ )
39
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
40
+ class RecipeLockBase:
41
+ recipe: identifier_t.IdentifierKey
42
+
43
+
44
+ # DO NOT MODIFY -- This file is generated by type_spec
45
+ @serial_class(
46
+ named_type_path="sdk.api.recipes.lock_recipes.Arguments",
47
+ )
48
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
49
+ class Arguments:
50
+ type: RecipeLockType = RecipeLockType.ALL
51
+ recipes: list[identifier_t.IdentifierKey]
52
+ globally_removable: bool
53
+ lock_samples: bool | None = None
54
+ comments: str | None = None
55
+
56
+
57
+ # DO NOT MODIFY -- This file is generated by type_spec
58
+ @serial_class(
59
+ named_type_path="sdk.api.recipes.lock_recipes.Data",
60
+ )
61
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
62
+ class Data(async_batch_t.AsyncBatchActionReturn):
63
+ pass
64
+ # 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 base_t
12
+ from ... import identifier_t
13
+
14
+ __all__: list[str] = [
15
+ "Arguments",
16
+ "Data",
17
+ "ENDPOINT_METHOD",
18
+ "ENDPOINT_PATH",
19
+ ]
20
+
21
+ ENDPOINT_METHOD = "POST"
22
+ ENDPOINT_PATH = "api/external/recipes/remove_recipe_from_project"
23
+
24
+
25
+ # DO NOT MODIFY -- This file is generated by type_spec
26
+ @serial_class(
27
+ named_type_path="sdk.api.recipes.remove_recipe_from_project.Arguments",
28
+ )
29
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
30
+ class Arguments:
31
+ recipe_key: identifier_t.IdentifierKey
32
+ project_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.remove_recipe_from_project.Data",
38
+ )
39
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
40
+ class Data:
41
+ pass
42
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,15 +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
9
+ import dataclasses
11
10
  from pkgs.serialization import serial_class
12
- from ... import base as base_t
11
+ from ... import base_t
13
12
 
14
13
  __all__: list[str] = [
15
14
  "Arguments",
@@ -25,28 +24,35 @@ ENDPOINT_PATH = "api/external/recipes/external_set_recipe_inputs"
25
24
 
26
25
  # DO NOT MODIFY -- This file is generated by type_spec
27
26
  @serial_class(
27
+ named_type_path="sdk.api.recipes.set_recipe_inputs.RecipeInputValue",
28
28
  to_string_values={"value_numeric"},
29
29
  )
30
- @dataclass(kw_only=True)
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
31
  class RecipeInputValue:
32
32
  recipe_id: base_t.ObjectId
33
33
  input_id: base_t.ObjectId
34
- recipe_step_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None
35
- value_numeric: typing.Optional[Decimal] = None
36
- value_str: typing.Optional[str] = None
37
- set_actual_value: typing.Optional[bool] = None
38
- lot_recipe_id: typing.Optional[base_t.ObjectId] = None
39
- 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
40
40
 
41
41
 
42
42
  # DO NOT MODIFY -- This file is generated by type_spec
43
- @dataclass(kw_only=True)
43
+ @serial_class(
44
+ named_type_path="sdk.api.recipes.set_recipe_inputs.Arguments",
45
+ )
46
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
47
  class Arguments:
45
48
  input_data: list[RecipeInputValue]
46
49
 
47
50
 
48
51
  # DO NOT MODIFY -- This file is generated by type_spec
49
- @dataclass(kw_only=True)
52
+ @serial_class(
53
+ named_type_path="sdk.api.recipes.set_recipe_inputs.Data",
54
+ )
55
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
50
56
  class Data:
51
57
  pass
52
58
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,15 +1,16 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # 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 identifier as identifier_t
12
- from ... import recipe_metadata as recipe_metadata_t
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import base_t
12
+ from ... import identifier_t
13
+ from ... import recipe_metadata_t
13
14
 
14
15
  __all__: list[str] = [
15
16
  "Arguments",
@@ -23,14 +24,20 @@ ENDPOINT_PATH = "api/external/recipes/set_recipe_metadata"
23
24
 
24
25
 
25
26
  # DO NOT MODIFY -- This file is generated by type_spec
26
- @dataclass(kw_only=True)
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.set_recipe_metadata.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
  recipe_metadata: list[recipe_metadata_t.MetadataValue]
30
34
 
31
35
 
32
36
  # DO NOT MODIFY -- This file is generated by type_spec
33
- @dataclass(kw_only=True)
37
+ @serial_class(
38
+ named_type_path="sdk.api.recipes.set_recipe_metadata.Data",
39
+ )
40
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
34
41
  class Data:
35
42
  pass
36
43
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,114 @@
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
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_union_annotation
13
+ from ... import base_t
14
+ from ... import identifier_t
15
+
16
+ __all__: list[str] = [
17
+ "AnnotationEdit",
18
+ "AnnotationUpdateType",
19
+ "Arguments",
20
+ "Data",
21
+ "ENDPOINT_METHOD",
22
+ "ENDPOINT_PATH",
23
+ "RecipeOutputEditBase",
24
+ "RecipeOutputMergeAnnotations",
25
+ "RecipeOutputReplaceAnnotations",
26
+ "RecipeOutputUpdateAnnotations",
27
+ ]
28
+
29
+ ENDPOINT_METHOD = "POST"
30
+ ENDPOINT_PATH = "api/external/recipes/set_recipe_output_annotations"
31
+
32
+
33
+ # DO NOT MODIFY -- This file is generated by type_spec
34
+ @serial_class(
35
+ named_type_path="sdk.api.recipes.set_recipe_output_annotations.AnnotationEdit",
36
+ to_string_values={"lower_value", "upper_value"},
37
+ )
38
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
39
+ class AnnotationEdit:
40
+ annotation_type_key: identifier_t.IdentifierKey
41
+ lower_value: Decimal | None = None
42
+ upper_value: Decimal | None = None
43
+
44
+
45
+ # DO NOT MODIFY -- This file is generated by type_spec
46
+ class AnnotationUpdateType(StrEnum):
47
+ MERGE = "merge"
48
+ REPLACE = "replace"
49
+
50
+
51
+ # DO NOT MODIFY -- This file is generated by type_spec
52
+ @serial_class(
53
+ named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputEditBase",
54
+ )
55
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
56
+ class RecipeOutputEditBase:
57
+ recipe_id: base_t.ObjectId
58
+ output_id: base_t.ObjectId
59
+ experiment_num: int
60
+ annotations: list[AnnotationEdit]
61
+ condition_id: base_t.ObjectId | None = None
62
+
63
+
64
+ # DO NOT MODIFY -- This file is generated by type_spec
65
+ @serial_class(
66
+ named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputMergeAnnotations",
67
+ parse_require={"type"},
68
+ )
69
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
70
+ class RecipeOutputMergeAnnotations(RecipeOutputEditBase):
71
+ type: typing.Literal[AnnotationUpdateType.MERGE] = AnnotationUpdateType.MERGE
72
+
73
+
74
+ # DO NOT MODIFY -- This file is generated by type_spec
75
+ @serial_class(
76
+ named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputReplaceAnnotations",
77
+ parse_require={"type"},
78
+ )
79
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
80
+ class RecipeOutputReplaceAnnotations(RecipeOutputEditBase):
81
+ type: typing.Literal[AnnotationUpdateType.REPLACE] = AnnotationUpdateType.REPLACE
82
+
83
+
84
+ # DO NOT MODIFY -- This file is generated by type_spec
85
+ RecipeOutputUpdateAnnotations = typing.Annotated[
86
+ RecipeOutputMergeAnnotations | RecipeOutputReplaceAnnotations,
87
+ serial_union_annotation(
88
+ named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputUpdateAnnotations",
89
+ discriminator="type",
90
+ discriminator_map={
91
+ "merge": RecipeOutputMergeAnnotations,
92
+ "replace": RecipeOutputReplaceAnnotations,
93
+ },
94
+ ),
95
+ ]
96
+
97
+
98
+ # DO NOT MODIFY -- This file is generated by type_spec
99
+ @serial_class(
100
+ named_type_path="sdk.api.recipes.set_recipe_output_annotations.Arguments",
101
+ )
102
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
103
+ class Arguments:
104
+ updates: list[RecipeOutputUpdateAnnotations]
105
+
106
+
107
+ # DO NOT MODIFY -- This file is generated by type_spec
108
+ @serial_class(
109
+ named_type_path="sdk.api.recipes.set_recipe_output_annotations.Data",
110
+ )
111
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
112
+ class Data:
113
+ pass
114
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,55 @@
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 response_t
13
+
14
+ __all__: list[str] = [
15
+ "Arguments",
16
+ "Data",
17
+ "ENDPOINT_METHOD",
18
+ "ENDPOINT_PATH",
19
+ "RecipeOutputFileValue",
20
+ ]
21
+
22
+ ENDPOINT_METHOD = "POST"
23
+ ENDPOINT_PATH = "api/external/recipes/external_set_recipe_output_file"
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ @serial_class(
28
+ named_type_path="sdk.api.recipes.set_recipe_output_file.RecipeOutputFileValue",
29
+ )
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
+ class RecipeOutputFileValue:
32
+ recipe_id: base_t.ObjectId
33
+ output_id: base_t.ObjectId
34
+ experiment_num: int
35
+ condition_id: base_t.ObjectId | None = None
36
+ file_id: base_t.ObjectId | None = None
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @serial_class(
41
+ named_type_path="sdk.api.recipes.set_recipe_output_file.Arguments",
42
+ )
43
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
+ class Arguments:
45
+ output_file_data: RecipeOutputFileValue
46
+
47
+
48
+ # DO NOT MODIFY -- This file is generated by type_spec
49
+ @serial_class(
50
+ named_type_path="sdk.api.recipes.set_recipe_output_file.Data",
51
+ )
52
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
53
+ class Data(response_t.Response):
54
+ pass
55
+ # DO NOT MODIFY -- This file is generated by type_spec