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,6 +1,5 @@
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
  # ruff: noqa: PLR0904
@@ -9,24 +8,40 @@ import typing # noqa: F401
9
8
  import datetime # noqa: F401
10
9
  from decimal import Decimal # noqa: F401
11
10
  from pkgs.serialization import OpaqueKey
11
+ import uncountable.types.api.notebooks.add_notebook_content as add_notebook_content_t
12
+ import uncountable.types.api.recipes.add_recipe_to_project as add_recipe_to_project_t
13
+ import uncountable.types.api.recipes.add_time_series_data as add_time_series_data_t
12
14
  import uncountable.types.api.recipes.archive_recipes as archive_recipes_t
15
+ import uncountable.types.api.equipment.associate_equipment_input as associate_equipment_input_t
13
16
  import uncountable.types.api.recipes.associate_recipe_as_input as associate_recipe_as_input_t
14
17
  import uncountable.types.api.recipes.associate_recipe_as_lot as associate_recipe_as_lot_t
15
- from uncountable.types import async_batch as async_batch_t
16
- from uncountable.types import base as base_t
18
+ from uncountable.types import async_batch_t
19
+ from uncountable.types import base_t
20
+ import uncountable.types.api.recipes.clear_recipe_outputs as clear_recipe_outputs_t
21
+ from uncountable.types import client_config_t
22
+ import uncountable.types.api.uploader.complete_async_parse as complete_async_parse_t
23
+ import uncountable.types.api.runsheet.complete_async_upload as complete_async_upload_t
17
24
  import uncountable.types.api.chemical.convert_chemical_formats as convert_chemical_formats_t
18
25
  import uncountable.types.api.entity.create_entities as create_entities_t
19
26
  import uncountable.types.api.entity.create_entity as create_entity_t
20
27
  import uncountable.types.api.inputs.create_inputs as create_inputs_t
28
+ import uncountable.types.api.recipes.create_mix_order as create_mix_order_t
29
+ import uncountable.types.api.entity.create_or_update_entity as create_or_update_entity_t
21
30
  import uncountable.types.api.recipes.create_recipe as create_recipe_t
22
31
  import uncountable.types.api.recipe_links.create_recipe_link as create_recipe_link_t
23
32
  import uncountable.types.api.recipes.create_recipes as create_recipes_t
24
33
  import uncountable.types.api.recipes.disassociate_recipe_as_input as disassociate_recipe_as_input_t
25
34
  import uncountable.types.api.recipes.edit_recipe_inputs as edit_recipe_inputs_t
26
- from uncountable.types import entity as entity_t
35
+ from uncountable.types import entity_t
27
36
  import uncountable.types.api.batch.execute_batch as execute_batch_t
28
37
  import uncountable.types.api.batch.execute_batch_load_async as execute_batch_load_async_t
29
- from uncountable.types import field_values as field_values_t
38
+ import uncountable.types.api.entity.export_entities as export_entities_t
39
+ from uncountable.types import exports_t
40
+ import uncountable.types.api.listing.fetch_listing as fetch_listing_t
41
+ from uncountable.types import field_values_t
42
+ from uncountable.types import generic_upload_t
43
+ import uncountable.types.api.recipes.get_column_calculation_values as get_column_calculation_values_t
44
+ import uncountable.types.api.user.get_current_user_info as get_current_user_info_t
30
45
  import uncountable.types.api.recipes.get_curve as get_curve_t
31
46
  import uncountable.types.api.entity.get_entities_data as get_entities_data_t
32
47
  import uncountable.types.api.inputs.get_input_data as get_input_data_t
@@ -43,39 +58,69 @@ import uncountable.types.api.recipe_metadata.get_recipe_metadata_data as get_rec
43
58
  import uncountable.types.api.recipes.get_recipe_names as get_recipe_names_t
44
59
  import uncountable.types.api.recipes.get_recipe_output_metadata as get_recipe_output_metadata_t
45
60
  import uncountable.types.api.recipes.get_recipes_data as get_recipes_data_t
46
- from uncountable.types import id_source as id_source_t
47
- from uncountable.types import identifier as identifier_t
61
+ import uncountable.types.api.entity.grant_entity_permissions as grant_entity_permissions_t
62
+ from uncountable.types import id_source_t
63
+ from uncountable.types import identifier_t
64
+ import uncountable.types.api.uploader.invoke_uploader as invoke_uploader_t
65
+ import uncountable.types.api.entity.list_aggregate as list_aggregate_t
48
66
  import uncountable.types.api.entity.list_entities as list_entities_t
49
67
  import uncountable.types.api.id_source.list_id_source as list_id_source_t
68
+ from uncountable.types import listing_t
69
+ import uncountable.types.api.entity.lock_entity as lock_entity_t
70
+ import uncountable.types.api.recipes.lock_recipes as lock_recipes_t
71
+ import uncountable.types.api.entity.lookup_entity as lookup_entity_t
50
72
  import uncountable.types.api.id_source.match_id_source as match_id_source_t
51
- from uncountable.types import permissions as permissions_t
52
- from uncountable.types import post_base as post_base_t
53
- from uncountable.types import recipe_identifiers as recipe_identifiers_t
54
- from uncountable.types import recipe_links as recipe_links_t
55
- from uncountable.types import recipe_metadata as recipe_metadata_t
56
- from uncountable.types import recipe_workflow_steps as recipe_workflow_steps_t
73
+ from uncountable.types import notices_t
74
+ from uncountable.types import notifications_t
75
+ from uncountable.types import permissions_t
76
+ from uncountable.types import post_base_t
77
+ import uncountable.types.api.integrations.push_notification as push_notification_t
78
+ from uncountable.types import recipe_identifiers_t
79
+ from uncountable.types import recipe_links_t
80
+ from uncountable.types import recipe_metadata_t
81
+ from uncountable.types import recipe_workflow_steps_t
82
+ import uncountable.types.api.integrations.register_sockets_token as register_sockets_token_t
83
+ import uncountable.types.api.recipes.remove_recipe_from_project as remove_recipe_from_project_t
84
+ import uncountable.types.api.recipe_links.remove_recipe_link as remove_recipe_link_t
57
85
  import uncountable.types.api.entity.resolve_entity_ids as resolve_entity_ids_t
58
86
  import uncountable.types.api.outputs.resolve_output_conditions as resolve_output_conditions_t
59
87
  import uncountable.types.api.triggers.run_trigger as run_trigger_t
60
88
  import uncountable.types.api.permissions.set_core_permissions as set_core_permissions_t
89
+ import uncountable.types.api.entity.set_entity_field_values as set_entity_field_values_t
61
90
  import uncountable.types.api.inputs.set_input_attribute_values as set_input_attribute_values_t
91
+ import uncountable.types.api.inputs.set_input_category as set_input_category_t
92
+ import uncountable.types.api.inputs.set_input_subcategories as set_input_subcategories_t
93
+ import uncountable.types.api.inputs.set_intermediate_type as set_intermediate_type_t
62
94
  import uncountable.types.api.recipes.set_recipe_inputs as set_recipe_inputs_t
63
95
  import uncountable.types.api.recipes.set_recipe_metadata as set_recipe_metadata_t
96
+ import uncountable.types.api.recipes.set_recipe_output_annotations as set_recipe_output_annotations_t
97
+ import uncountable.types.api.recipes.set_recipe_output_file as set_recipe_output_file_t
64
98
  import uncountable.types.api.recipes.set_recipe_outputs as set_recipe_outputs_t
65
99
  import uncountable.types.api.recipes.set_recipe_tags as set_recipe_tags_t
100
+ import uncountable.types.api.recipes.set_recipe_total as set_recipe_total_t
66
101
  import uncountable.types.api.entity.set_values as set_values_t
102
+ from uncountable.types import sockets_t
103
+ from uncountable.types import structured_filters_t
67
104
  import uncountable.types.api.entity.transition_entity_phase as transition_entity_phase_t
105
+ import uncountable.types.api.recipes.unarchive_recipes as unarchive_recipes_t
106
+ import uncountable.types.api.entity.unlock_entity as unlock_entity_t
107
+ import uncountable.types.api.recipes.unlock_recipes as unlock_recipes_t
108
+ import uncountable.types.api.material_families.update_entity_material_families as update_entity_material_families_t
109
+ from uncountable.types import uploader_t
110
+ import uncountable.types.api.condition_parameters.upsert_condition_match as upsert_condition_match_t
111
+ import uncountable.types.api.field_options.upsert_field_options as upsert_field_options_t
68
112
  from abc import ABC, abstractmethod
69
- from dataclasses import dataclass
113
+ import dataclasses
70
114
 
71
115
  DT = typing.TypeVar("DT")
72
116
 
73
117
 
74
- @dataclass(kw_only=True)
118
+ @dataclasses.dataclass(kw_only=True)
75
119
  class APIRequest:
76
120
  method: str
77
121
  endpoint: str
78
122
  args: typing.Any
123
+ request_options: client_config_t.RequestOptions | None = None
79
124
 
80
125
 
81
126
  class ClientMethods(ABC):
@@ -84,11 +129,90 @@ class ClientMethods(ABC):
84
129
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
85
130
  ...
86
131
 
132
+ def add_notebook_content(
133
+ self,
134
+ *,
135
+ notebook_key: identifier_t.IdentifierKey,
136
+ location: add_notebook_content_t.Location,
137
+ contents: list[add_notebook_content_t.InputContent],
138
+ _request_options: client_config_t.RequestOptions | None = None,
139
+ ) -> add_notebook_content_t.Data:
140
+ """Adds content to an existing notebook
141
+
142
+ :param notebook_key: Key of the notebook to add the content to
143
+ :param location: The location to add the content to in the notebook
144
+ :param contents: List of input content to add to the notebook
145
+ """
146
+ args = add_notebook_content_t.Arguments(
147
+ notebook_key=notebook_key,
148
+ location=location,
149
+ contents=contents,
150
+ )
151
+ api_request = APIRequest(
152
+ method=add_notebook_content_t.ENDPOINT_METHOD,
153
+ endpoint=add_notebook_content_t.ENDPOINT_PATH,
154
+ args=args,
155
+ request_options=_request_options,
156
+ )
157
+ return self.do_request(api_request=api_request, return_type=add_notebook_content_t.Data)
158
+
159
+ def add_recipe_to_project(
160
+ self,
161
+ *,
162
+ recipe_key: identifier_t.IdentifierKey,
163
+ project_key: identifier_t.IdentifierKey,
164
+ _request_options: client_config_t.RequestOptions | None = None,
165
+ ) -> add_recipe_to_project_t.Data:
166
+ """Adds a recipe to a project
167
+
168
+ :param recipe_key: The identifier key of the recipe to add to the project
169
+ :param project_key: The identifier key of the project to add the recipe to
170
+ """
171
+ args = add_recipe_to_project_t.Arguments(
172
+ recipe_key=recipe_key,
173
+ project_key=project_key,
174
+ )
175
+ api_request = APIRequest(
176
+ method=add_recipe_to_project_t.ENDPOINT_METHOD,
177
+ endpoint=add_recipe_to_project_t.ENDPOINT_PATH,
178
+ args=args,
179
+ request_options=_request_options,
180
+ )
181
+ return self.do_request(api_request=api_request, return_type=add_recipe_to_project_t.Data)
182
+
183
+ def external_add_time_series_data(
184
+ self,
185
+ *,
186
+ time_series_segment_key: identifier_t.IdentifierKey,
187
+ time_series_data: list[add_time_series_data_t.TimeSeriesDatum],
188
+ on_conflict: add_time_series_data_t.OnTimepointConflict = add_time_series_data_t.OnTimepointConflict.ERROR,
189
+ _request_options: client_config_t.RequestOptions | None = None,
190
+ ) -> add_time_series_data_t.Data:
191
+ """Add timepoint data to a time series segment.
192
+
193
+ :param time_series_segment_key: The time series segment to add data to
194
+ :param time_series_data: The data to add to the time series segment
195
+ :param on_conflict: What to do if a TimeSeriesDatum already exists at the same timestamp
196
+ """
197
+ args = add_time_series_data_t.Arguments(
198
+ time_series_segment_key=time_series_segment_key,
199
+ time_series_data=time_series_data,
200
+ on_conflict=on_conflict,
201
+ )
202
+ api_request = APIRequest(
203
+ method=add_time_series_data_t.ENDPOINT_METHOD,
204
+ endpoint=add_time_series_data_t.ENDPOINT_PATH,
205
+ args=args,
206
+ request_options=_request_options,
207
+ )
208
+ return self.do_request(api_request=api_request, return_type=add_time_series_data_t.Data)
209
+
87
210
  def archive_recipes(
88
211
  self,
89
212
  *,
90
213
  recipes: list[identifier_t.IdentifierKey],
91
- reason: typing.Optional[str] = None,
214
+ reason: str | None = None,
215
+ _request_options: client_config_t.RequestOptions | None = None,
92
216
  ) -> archive_recipes_t.Data:
93
217
  """Archive the provided recipes and their children
94
218
 
@@ -103,28 +227,58 @@ class ClientMethods(ABC):
103
227
  method=archive_recipes_t.ENDPOINT_METHOD,
104
228
  endpoint=archive_recipes_t.ENDPOINT_PATH,
105
229
  args=args,
230
+ request_options=_request_options,
106
231
  )
107
232
  return self.do_request(api_request=api_request, return_type=archive_recipes_t.Data)
108
233
 
234
+ def associate_equipment_input(
235
+ self,
236
+ *,
237
+ equipment_key: identifier_t.IdentifierKey,
238
+ material_family_ids: list[base_t.ObjectId],
239
+ _request_options: client_config_t.RequestOptions | None = None,
240
+ ) -> associate_equipment_input_t.Data:
241
+ """Create or return the input association for equipment
242
+
243
+ :param equipment_key: Identifier of the equipment to associate
244
+ :param material_family_ids: The list of material families to add the input to. This must be non-empty
245
+ """
246
+ args = associate_equipment_input_t.Arguments(
247
+ equipment_key=equipment_key,
248
+ material_family_ids=material_family_ids,
249
+ )
250
+ api_request = APIRequest(
251
+ method=associate_equipment_input_t.ENDPOINT_METHOD,
252
+ endpoint=associate_equipment_input_t.ENDPOINT_PATH,
253
+ args=args,
254
+ request_options=_request_options,
255
+ )
256
+ return self.do_request(api_request=api_request, return_type=associate_equipment_input_t.Data)
257
+
109
258
  def associate_recipe_as_input(
110
259
  self,
111
260
  *,
112
261
  recipe_key: identifier_t.IdentifierKey,
113
- input_key: typing.Optional[identifier_t.IdentifierKey] = None,
262
+ input_key: identifier_t.IdentifierKey | None = None,
263
+ show_in_listings: bool | None = None,
264
+ _request_options: client_config_t.RequestOptions | None = None,
114
265
  ) -> associate_recipe_as_input_t.Data:
115
266
  """Create or return the input association for a recipe
116
267
 
117
268
  :param recipe_key: Identifier for the recipe
118
269
  :param input_key: Identifier for an input to use for the association. Optionally supplied. If not supplied, one is created
270
+ :param show_in_listings: After associating the input should it be present in listings
119
271
  """
120
272
  args = associate_recipe_as_input_t.Arguments(
121
273
  recipe_key=recipe_key,
122
274
  input_key=input_key,
275
+ show_in_listings=show_in_listings,
123
276
  )
124
277
  api_request = APIRequest(
125
278
  method=associate_recipe_as_input_t.ENDPOINT_METHOD,
126
279
  endpoint=associate_recipe_as_input_t.ENDPOINT_PATH,
127
280
  args=args,
281
+ request_options=_request_options,
128
282
  )
129
283
  return self.do_request(api_request=api_request, return_type=associate_recipe_as_input_t.Data)
130
284
 
@@ -133,6 +287,7 @@ class ClientMethods(ABC):
133
287
  *,
134
288
  recipe_key: identifier_t.IdentifierKey,
135
289
  ingredient_key: identifier_t.IdentifierKey,
290
+ _request_options: client_config_t.RequestOptions | None = None,
136
291
  ) -> associate_recipe_as_lot_t.Data:
137
292
  """Create a new lot association for the provided recipe with the provided ingredient
138
293
 
@@ -147,13 +302,82 @@ class ClientMethods(ABC):
147
302
  method=associate_recipe_as_lot_t.ENDPOINT_METHOD,
148
303
  endpoint=associate_recipe_as_lot_t.ENDPOINT_PATH,
149
304
  args=args,
305
+ request_options=_request_options,
150
306
  )
151
307
  return self.do_request(api_request=api_request, return_type=associate_recipe_as_lot_t.Data)
152
308
 
309
+ def clear_recipe_outputs(
310
+ self,
311
+ *,
312
+ recipe_key: identifier_t.IdentifierKey,
313
+ _request_options: client_config_t.RequestOptions | None = None,
314
+ ) -> clear_recipe_outputs_t.Data:
315
+ """Clears all output values & output metadata for a given recipe
316
+
317
+ :param recipe_key: The identifier of the recipe
318
+ """
319
+ args = clear_recipe_outputs_t.Arguments(
320
+ recipe_key=recipe_key,
321
+ )
322
+ api_request = APIRequest(
323
+ method=clear_recipe_outputs_t.ENDPOINT_METHOD,
324
+ endpoint=clear_recipe_outputs_t.ENDPOINT_PATH,
325
+ args=args,
326
+ request_options=_request_options,
327
+ )
328
+ return self.do_request(api_request=api_request, return_type=clear_recipe_outputs_t.Data)
329
+
330
+ def complete_async_parse(
331
+ self,
332
+ *,
333
+ parsed_file_data: list[uploader_t.ParsedFileData],
334
+ async_job_key: identifier_t.IdentifierKey,
335
+ upload_destination: generic_upload_t.UploadDestinationRecipe,
336
+ _request_options: client_config_t.RequestOptions | None = None,
337
+ ) -> complete_async_parse_t.Data:
338
+ """Parses uploaded files asynchronously
339
+
340
+ """
341
+ args = complete_async_parse_t.Arguments(
342
+ parsed_file_data=parsed_file_data,
343
+ async_job_key=async_job_key,
344
+ upload_destination=upload_destination,
345
+ )
346
+ api_request = APIRequest(
347
+ method=complete_async_parse_t.ENDPOINT_METHOD,
348
+ endpoint=complete_async_parse_t.ENDPOINT_PATH,
349
+ args=args,
350
+ request_options=_request_options,
351
+ )
352
+ return self.do_request(api_request=api_request, return_type=complete_async_parse_t.Data)
353
+
354
+ def complete_async_upload(
355
+ self,
356
+ *,
357
+ async_job_id: base_t.ObjectId,
358
+ file_id: base_t.ObjectId,
359
+ _request_options: client_config_t.RequestOptions | None = None,
360
+ ) -> complete_async_upload_t.Data:
361
+ """Processes an file id with a given async job id to be uploaded asynchronously
362
+
363
+ """
364
+ args = complete_async_upload_t.Arguments(
365
+ async_job_id=async_job_id,
366
+ file_id=file_id,
367
+ )
368
+ api_request = APIRequest(
369
+ method=complete_async_upload_t.ENDPOINT_METHOD,
370
+ endpoint=complete_async_upload_t.ENDPOINT_PATH,
371
+ args=args,
372
+ request_options=_request_options,
373
+ )
374
+ return self.do_request(api_request=api_request, return_type=complete_async_upload_t.Data)
375
+
153
376
  def convert_chemical_formats(
154
377
  self,
155
378
  *,
156
379
  source_chemical_structures: list[convert_chemical_formats_t.ChemicalStructureFile],
380
+ _request_options: client_config_t.RequestOptions | None = None,
157
381
  ) -> convert_chemical_formats_t.Data:
158
382
  """Converts chemical formats, into the format used by Uncountable and usable in other APIs for eg. set_input_attribute_values
159
383
 
@@ -165,24 +389,29 @@ class ClientMethods(ABC):
165
389
  method=convert_chemical_formats_t.ENDPOINT_METHOD,
166
390
  endpoint=convert_chemical_formats_t.ENDPOINT_PATH,
167
391
  args=args,
392
+ request_options=_request_options,
168
393
  )
169
394
  return self.do_request(api_request=api_request, return_type=convert_chemical_formats_t.Data)
170
395
 
171
396
  def create_entities(
172
397
  self,
173
398
  *,
174
- definition_id: base_t.ObjectId,
175
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK]],
399
+ entity_type: entity_t.LimitedEntityType,
176
400
  entities_to_create: list[create_entities_t.EntityToCreate],
401
+ definition_id: base_t.ObjectId | None = None,
402
+ definition_key: identifier_t.IdentifierKey | None = None,
403
+ _request_options: client_config_t.RequestOptions | None = None,
177
404
  ) -> create_entities_t.Data:
178
405
  """Creates new Uncountable entities
179
406
 
180
407
  :param definition_id: Definition id for the entities to create
408
+ :param definition_key: Key for the definition of the entities to create
181
409
  :param entity_type: The type of the entities to create
182
410
  :param entities_to_create: A list of the entities to create
183
411
  """
184
412
  args = create_entities_t.Arguments(
185
413
  definition_id=definition_id,
414
+ definition_key=definition_key,
186
415
  entity_type=entity_type,
187
416
  entities_to_create=entities_to_create,
188
417
  )
@@ -190,30 +419,39 @@ class ClientMethods(ABC):
190
419
  method=create_entities_t.ENDPOINT_METHOD,
191
420
  endpoint=create_entities_t.ENDPOINT_PATH,
192
421
  args=args,
422
+ request_options=_request_options,
193
423
  )
194
424
  return self.do_request(api_request=api_request, return_type=create_entities_t.Data)
195
425
 
196
426
  def create_entity(
197
427
  self,
198
428
  *,
199
- definition_id: base_t.ObjectId,
200
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK]],
201
- field_values: typing.Optional[typing.Optional[list[field_values_t.FieldRefNameValue]]] = None,
429
+ entity_type: entity_t.LimitedEntityType,
430
+ definition_id: base_t.ObjectId | None = None,
431
+ definition_key: identifier_t.IdentifierKey | None = None,
432
+ field_values: list[field_values_t.FieldRefNameValue] | None = None,
433
+ parent_entity: entity_t.Entity | None = None,
434
+ _request_options: client_config_t.RequestOptions | None = None,
202
435
  ) -> create_entity_t.Data:
203
436
  """Creates a new Uncountable entity
204
437
 
205
438
  :param definition_id: Definition id of the entity to create
439
+ :param definition_key: Key for the definition of the entity to create
206
440
  :param entity_type: The type of the entities requested
441
+ :param parent_entity: The parent entity associated for this new entity. This only applies if there is a pre-defined relationship.
207
442
  """
208
443
  args = create_entity_t.Arguments(
209
444
  definition_id=definition_id,
445
+ definition_key=definition_key,
210
446
  entity_type=entity_type,
211
447
  field_values=field_values,
448
+ parent_entity=parent_entity,
212
449
  )
213
450
  api_request = APIRequest(
214
451
  method=create_entity_t.ENDPOINT_METHOD,
215
452
  endpoint=create_entity_t.ENDPOINT_PATH,
216
453
  args=args,
454
+ request_options=_request_options,
217
455
  )
218
456
  return self.do_request(api_request=api_request, return_type=create_entity_t.Data)
219
457
 
@@ -221,6 +459,7 @@ class ClientMethods(ABC):
221
459
  self,
222
460
  *,
223
461
  inputs_to_create: list[create_inputs_t.InputToCreate],
462
+ _request_options: client_config_t.RequestOptions | None = None,
224
463
  ) -> create_inputs_t.Data:
225
464
  """Creates new inputs
226
465
 
@@ -233,24 +472,79 @@ class ClientMethods(ABC):
233
472
  method=create_inputs_t.ENDPOINT_METHOD,
234
473
  endpoint=create_inputs_t.ENDPOINT_PATH,
235
474
  args=args,
475
+ request_options=_request_options,
236
476
  )
237
477
  return self.do_request(api_request=api_request, return_type=create_inputs_t.Data)
238
478
 
479
+ def create_mix_order(
480
+ self,
481
+ *,
482
+ recipe_key: identifier_t.IdentifierKey,
483
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier,
484
+ _request_options: client_config_t.RequestOptions | None = None,
485
+ ) -> create_mix_order_t.Data:
486
+ """Creates mix order on a recipe workflow step
487
+
488
+ """
489
+ args = create_mix_order_t.Arguments(
490
+ recipe_key=recipe_key,
491
+ recipe_workflow_step_identifier=recipe_workflow_step_identifier,
492
+ )
493
+ api_request = APIRequest(
494
+ method=create_mix_order_t.ENDPOINT_METHOD,
495
+ endpoint=create_mix_order_t.ENDPOINT_PATH,
496
+ args=args,
497
+ request_options=_request_options,
498
+ )
499
+ return self.do_request(api_request=api_request, return_type=create_mix_order_t.Data)
500
+
501
+ def create_or_update_entity(
502
+ self,
503
+ *,
504
+ entity_type: entity_t.EntityType,
505
+ definition_key: identifier_t.IdentifierKey,
506
+ field_values: list[field_values_t.FieldArgumentValue],
507
+ entity_key: identifier_t.IdentifierKey | None = None,
508
+ on_create_init_field_values: list[field_values_t.FieldArgumentValue] | None = None,
509
+ _request_options: client_config_t.RequestOptions | None = None,
510
+ ) -> create_or_update_entity_t.Data:
511
+ """Creates or updates field values for an entity
512
+
513
+ :param on_create_init_field_values: Field values set only when the entity is created (will be ignored if entity already exists)
514
+ """
515
+ args = create_or_update_entity_t.Arguments(
516
+ entity_key=entity_key,
517
+ entity_type=entity_type,
518
+ definition_key=definition_key,
519
+ field_values=field_values,
520
+ on_create_init_field_values=on_create_init_field_values,
521
+ )
522
+ api_request = APIRequest(
523
+ method=create_or_update_entity_t.ENDPOINT_METHOD,
524
+ endpoint=create_or_update_entity_t.ENDPOINT_PATH,
525
+ args=args,
526
+ request_options=_request_options,
527
+ )
528
+ return self.do_request(api_request=api_request, return_type=create_or_update_entity_t.Data)
529
+
239
530
  def create_recipe(
240
531
  self,
241
532
  *,
242
533
  material_family_id: base_t.ObjectId,
243
534
  workflow_id: base_t.ObjectId,
244
- name: typing.Optional[str] = None,
245
- workflow_variant_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None,
246
- recipe_metadata: typing.Optional[list[recipe_metadata_t.MetadataValue]] = None,
247
- identifiers: typing.Optional[recipe_identifiers_t.RecipeIdentifiers] = None,
248
- definition_key: typing.Optional[identifier_t.IdentifierKey] = None,
535
+ name: str | None = None,
536
+ project_id: base_t.ObjectId | None = None,
537
+ workflow_variant_id: base_t.ObjectId | None = None,
538
+ recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None,
539
+ identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None,
540
+ definition_key: identifier_t.IdentifierKey | None = None,
541
+ _request_options: client_config_t.RequestOptions | None = None,
249
542
  ) -> create_recipe_t.Data:
250
543
  """Returns the id of the recipe being created.
251
544
 
252
545
  :param name: The name for the recipe
253
546
  :param material_family_id: The material family for the recipe
547
+ :param project_id: The identifier of the project to create the recipe in
254
548
  :param workflow_id: The identifier of the workflow to create the recipe with
255
549
  :param workflow_variant_id: The identifier of the workflow variant to create the recipe with
256
550
  :param recipe_metadata: Metadata values to populate the recipe with
@@ -260,6 +554,7 @@ class ClientMethods(ABC):
260
554
  args = create_recipe_t.Arguments(
261
555
  name=name,
262
556
  material_family_id=material_family_id,
557
+ project_id=project_id,
263
558
  workflow_id=workflow_id,
264
559
  workflow_variant_id=workflow_variant_id,
265
560
  recipe_metadata=recipe_metadata,
@@ -270,6 +565,7 @@ class ClientMethods(ABC):
270
565
  method=create_recipe_t.ENDPOINT_METHOD,
271
566
  endpoint=create_recipe_t.ENDPOINT_PATH,
272
567
  args=args,
568
+ request_options=_request_options,
273
569
  )
274
570
  return self.do_request(api_request=api_request, return_type=create_recipe_t.Data)
275
571
 
@@ -278,8 +574,9 @@ class ClientMethods(ABC):
278
574
  *,
279
575
  recipe_from_key: identifier_t.IdentifierKey,
280
576
  recipe_to_key: identifier_t.IdentifierKey,
281
- link_type: typing.Union[typing.Literal[recipe_links_t.RecipeLinkType.CHILD], typing.Literal[recipe_links_t.RecipeLinkType.CONTROL], typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK]],
282
- name: str,
577
+ link_type: typing.Literal[recipe_links_t.RecipeLinkType.CHILD] | typing.Literal[recipe_links_t.RecipeLinkType.CONTROL] | typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK] | typing.Literal[recipe_links_t.RecipeLinkType.PREVIOUS_EXPERIMENT],
578
+ name: str | None = None,
579
+ _request_options: client_config_t.RequestOptions | None = None,
283
580
  ) -> create_recipe_link_t.Data:
284
581
  """Create a link between two recipes. Skip if the link already exists
285
582
 
@@ -298,6 +595,7 @@ class ClientMethods(ABC):
298
595
  method=create_recipe_link_t.ENDPOINT_METHOD,
299
596
  endpoint=create_recipe_link_t.ENDPOINT_PATH,
300
597
  args=args,
598
+ request_options=_request_options,
301
599
  )
302
600
  return self.do_request(api_request=api_request, return_type=create_recipe_link_t.Data)
303
601
 
@@ -306,9 +604,10 @@ class ClientMethods(ABC):
306
604
  *,
307
605
  material_family_id: base_t.ObjectId,
308
606
  recipe_definitions: list[create_recipes_t.CreateRecipeDefinition],
309
- project_id: typing.Optional[base_t.ObjectId] = None,
607
+ project_id: base_t.ObjectId | None = None,
608
+ _request_options: client_config_t.RequestOptions | None = None,
310
609
  ) -> create_recipes_t.Data:
311
- """Sets inputs values for an experiment. Values set can be numeric, text or categorical types in the Uncountable system
610
+ """Creates recipes in Uncountable, optionally with metadata values, and returns the resulting ids in corresponding order
312
611
 
313
612
  :param material_family_id: The identifier of the material family to create the recipes in
314
613
  :param project_id: The identifier of the project to create the recipes in
@@ -322,6 +621,7 @@ class ClientMethods(ABC):
322
621
  method=create_recipes_t.ENDPOINT_METHOD,
323
622
  endpoint=create_recipes_t.ENDPOINT_PATH,
324
623
  args=args,
624
+ request_options=_request_options,
325
625
  )
326
626
  return self.do_request(api_request=api_request, return_type=create_recipes_t.Data)
327
627
 
@@ -329,6 +629,7 @@ class ClientMethods(ABC):
329
629
  self,
330
630
  *,
331
631
  recipe_key: identifier_t.IdentifierKey,
632
+ _request_options: client_config_t.RequestOptions | None = None,
332
633
  ) -> disassociate_recipe_as_input_t.Data:
333
634
  """Remove any association between a recipe and ingredients
334
635
 
@@ -341,6 +642,7 @@ class ClientMethods(ABC):
341
642
  method=disassociate_recipe_as_input_t.ENDPOINT_METHOD,
342
643
  endpoint=disassociate_recipe_as_input_t.ENDPOINT_PATH,
343
644
  args=args,
645
+ request_options=_request_options,
344
646
  )
345
647
  return self.do_request(api_request=api_request, return_type=disassociate_recipe_as_input_t.Data)
346
648
 
@@ -350,6 +652,7 @@ class ClientMethods(ABC):
350
652
  recipe_key: identifier_t.IdentifierKey,
351
653
  recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier,
352
654
  edits: list[edit_recipe_inputs_t.RecipeInputEdit],
655
+ _request_options: client_config_t.RequestOptions | None = None,
353
656
  ) -> edit_recipe_inputs_t.Data:
354
657
  """Clear, update, or add inputs on a recipe
355
658
 
@@ -364,6 +667,7 @@ class ClientMethods(ABC):
364
667
  method=edit_recipe_inputs_t.ENDPOINT_METHOD,
365
668
  endpoint=edit_recipe_inputs_t.ENDPOINT_PATH,
366
669
  args=args,
670
+ request_options=_request_options,
367
671
  )
368
672
  return self.do_request(api_request=api_request, return_type=edit_recipe_inputs_t.Data)
369
673
 
@@ -371,6 +675,7 @@ class ClientMethods(ABC):
371
675
  self,
372
676
  *,
373
677
  requests: list[execute_batch_t.BatchRequest],
678
+ _request_options: client_config_t.RequestOptions | None = None,
374
679
  ) -> execute_batch_t.Data:
375
680
  """Run multiple API calls via one request
376
681
 
@@ -382,6 +687,7 @@ class ClientMethods(ABC):
382
687
  method=execute_batch_t.ENDPOINT_METHOD,
383
688
  endpoint=execute_batch_t.ENDPOINT_PATH,
384
689
  args=args,
690
+ request_options=_request_options,
385
691
  )
386
692
  return self.do_request(api_request=api_request, return_type=execute_batch_t.Data)
387
693
 
@@ -389,6 +695,7 @@ class ClientMethods(ABC):
389
695
  self,
390
696
  *,
391
697
  requests: list[async_batch_t.AsyncBatchRequest],
698
+ _request_options: client_config_t.RequestOptions | None = None,
392
699
  ) -> execute_batch_load_async_t.Data:
393
700
  """Run multiple API calls via one request
394
701
 
@@ -400,14 +707,120 @@ class ClientMethods(ABC):
400
707
  method=execute_batch_load_async_t.ENDPOINT_METHOD,
401
708
  endpoint=execute_batch_load_async_t.ENDPOINT_PATH,
402
709
  args=args,
710
+ request_options=_request_options,
403
711
  )
404
712
  return self.do_request(api_request=api_request, return_type=execute_batch_load_async_t.Data)
405
713
 
714
+ def export_entities(
715
+ self,
716
+ *,
717
+ config_key: identifier_t.IdentifierKey,
718
+ type: exports_t.ExportType = exports_t.ExportType.EXCEL,
719
+ client_timezone: exports_t.ListingExportUserTimezone | None = None,
720
+ limit: int | None = None,
721
+ attributes: list[export_entities_t.ListingAttribute] | None = None,
722
+ _request_options: client_config_t.RequestOptions | None = None,
723
+ ) -> export_entities_t.Data:
724
+ """Uses a structured loading configuration to export entities in the system. This endpoint is asynchronous, and returns the job ID that can be used to query the status of the export.
725
+
726
+ :param config_key: The configuration reference for the listing config
727
+ :param limit: The number of data points to return. If not filled in, all filtered entities will be included in the export.
728
+ """
729
+ args = export_entities_t.Arguments(
730
+ config_key=config_key,
731
+ client_timezone=client_timezone,
732
+ limit=limit,
733
+ type=type,
734
+ attributes=attributes,
735
+ )
736
+ api_request = APIRequest(
737
+ method=export_entities_t.ENDPOINT_METHOD,
738
+ endpoint=export_entities_t.ENDPOINT_PATH,
739
+ args=args,
740
+ request_options=_request_options,
741
+ )
742
+ return self.do_request(api_request=api_request, return_type=export_entities_t.Data)
743
+
744
+ def fetch_listing(
745
+ self,
746
+ *,
747
+ entity_type: entity_t.EntityType,
748
+ columns: list[listing_t.ColumnIdentifier],
749
+ filters: structured_filters_t.FilterNode | None = None,
750
+ limit: int | None = None,
751
+ offset: int | None = None,
752
+ _request_options: client_config_t.RequestOptions | None = None,
753
+ ) -> fetch_listing_t.Data:
754
+ """External API for fetching a listing based on some structured columns and filters
755
+
756
+ :param entity_type: The entity type to fetch listing entries for
757
+ :param columns: The columns to include in the results
758
+ :param filters: Structured filters to apply to the listing, represented by a FilterNode object
759
+ :param limit: The number of entries to return. If not provided, defaults to 100. Note a maximum of 100 entries can be returned.
760
+ :param offset: The number of entries to skip for pagination
761
+ """
762
+ args = fetch_listing_t.Arguments(
763
+ entity_type=entity_type,
764
+ columns=columns,
765
+ filters=filters,
766
+ limit=limit,
767
+ offset=offset,
768
+ )
769
+ api_request = APIRequest(
770
+ method=fetch_listing_t.ENDPOINT_METHOD,
771
+ endpoint=fetch_listing_t.ENDPOINT_PATH,
772
+ args=args,
773
+ request_options=_request_options,
774
+ )
775
+ return self.do_request(api_request=api_request, return_type=fetch_listing_t.Data)
776
+
777
+ def get_column_calculation_values(
778
+ self,
779
+ *,
780
+ recipe_keys: list[identifier_t.IdentifierKey],
781
+ calculation_key: identifier_t.IdentifierKey,
782
+ _request_options: client_config_t.RequestOptions | None = None,
783
+ ) -> get_column_calculation_values_t.Data:
784
+ """Get the values for a column calculations for recipes
785
+
786
+ :param recipe_keys: Required: The recipe keys to load values for
787
+ :param calculation_key: Required: The calculation key to get the values for
788
+ """
789
+ args = get_column_calculation_values_t.Arguments(
790
+ recipe_keys=recipe_keys,
791
+ calculation_key=calculation_key,
792
+ )
793
+ api_request = APIRequest(
794
+ method=get_column_calculation_values_t.ENDPOINT_METHOD,
795
+ endpoint=get_column_calculation_values_t.ENDPOINT_PATH,
796
+ args=args,
797
+ request_options=_request_options,
798
+ )
799
+ return self.do_request(api_request=api_request, return_type=get_column_calculation_values_t.Data)
800
+
801
+ def get_current_user_info(
802
+ self,
803
+ *,
804
+ _request_options: client_config_t.RequestOptions | None = None,
805
+ ) -> get_current_user_info_t.Data:
806
+ """Return information about the current user
807
+
808
+ """
809
+ args = get_current_user_info_t.Arguments()
810
+ api_request = APIRequest(
811
+ method=get_current_user_info_t.ENDPOINT_METHOD,
812
+ endpoint=get_current_user_info_t.ENDPOINT_PATH,
813
+ args=args,
814
+ request_options=_request_options,
815
+ )
816
+ return self.do_request(api_request=api_request, return_type=get_current_user_info_t.Data)
817
+
406
818
  def get_curve(
407
819
  self,
408
820
  *,
409
- recipe_output_id: typing.Optional[base_t.ObjectId] = None,
410
- recipe_input_id: typing.Optional[base_t.ObjectId] = None,
821
+ recipe_output_id: base_t.ObjectId | None = None,
822
+ recipe_input_id: base_t.ObjectId | None = None,
823
+ _request_options: client_config_t.RequestOptions | None = None,
411
824
  ) -> get_curve_t.Data:
412
825
  """Returns an array of values for the specified curve id.
413
826
 
@@ -422,6 +835,7 @@ class ClientMethods(ABC):
422
835
  method=get_curve_t.ENDPOINT_METHOD,
423
836
  endpoint=get_curve_t.ENDPOINT_PATH,
424
837
  args=args,
838
+ request_options=_request_options,
425
839
  )
426
840
  return self.do_request(api_request=api_request, return_type=get_curve_t.Data)
427
841
 
@@ -430,6 +844,7 @@ class ClientMethods(ABC):
430
844
  *,
431
845
  entity_ids: list[base_t.ObjectId],
432
846
  entity_type: entity_t.EntityType,
847
+ _request_options: client_config_t.RequestOptions | None = None,
433
848
  ) -> get_entities_data_t.Data:
434
849
  """Gets the details for a passed entity
435
850
 
@@ -444,6 +859,7 @@ class ClientMethods(ABC):
444
859
  method=get_entities_data_t.ENDPOINT_METHOD,
445
860
  endpoint=get_entities_data_t.ENDPOINT_PATH,
446
861
  args=args,
862
+ request_options=_request_options,
447
863
  )
448
864
  return self.do_request(api_request=api_request, return_type=get_entities_data_t.Data)
449
865
 
@@ -451,18 +867,19 @@ class ClientMethods(ABC):
451
867
  self,
452
868
  *,
453
869
  material_family_id: base_t.ObjectId,
454
- input_ids: typing.Optional[list[base_t.ObjectId]],
455
- is_parameter: typing.Optional[bool],
456
- offset: typing.Optional[typing.Optional[int]] = None,
457
- limit: typing.Optional[typing.Optional[int]] = None,
870
+ input_ids: list[base_t.ObjectId] | None,
871
+ is_parameter: bool | None,
872
+ offset: int | None = None,
873
+ limit: int | None = None,
874
+ _request_options: client_config_t.RequestOptions | None = None,
458
875
  ) -> get_input_data_t.Data:
459
876
  """Gets the attribute, categorization and other metadata associated with a set of inputs. An input is either an ingredient or process parameter, with metadata and calculations assigned separately
460
877
 
461
878
  :param material_family_id: The material family ID to get the input values from.
462
879
  :param input_ids: The input IDs to get the data from. If this is not filled in, all inputs from a material family will be returned (in paginated form).
463
- :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the input ID
880
+ :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the input ID. [Pagination More Info](#pagination)
464
881
  :param is_parameter: Whether to get parameters or ingredients. By default both are returned. When set to true, only parameters are returned, and when set to false, only ingredients are returned
465
- :param limit: The maximum number of results to return. By default this is set to 1,000 and it cannot be set higher than 1,000
882
+ :param limit: The maximum number of results to return. By default this is set to 1,000 and it cannot be set higher than 1,000. [Pagination More Info](#pagination)
466
883
  """
467
884
  args = get_input_data_t.Arguments(
468
885
  material_family_id=material_family_id,
@@ -475,6 +892,7 @@ class ClientMethods(ABC):
475
892
  method=get_input_data_t.ENDPOINT_METHOD,
476
893
  endpoint=get_input_data_t.ENDPOINT_PATH,
477
894
  args=args,
895
+ request_options=_request_options,
478
896
  )
479
897
  return self.do_request(api_request=api_request, return_type=get_input_data_t.Data)
480
898
 
@@ -482,6 +900,7 @@ class ClientMethods(ABC):
482
900
  self,
483
901
  *,
484
902
  material_family_id: base_t.ObjectId,
903
+ _request_options: client_config_t.RequestOptions | None = None,
485
904
  ) -> get_input_group_names_t.Data:
486
905
  """Gets the name of all input groups in a material family that either the user created, or are shared to all users.
487
906
 
@@ -494,6 +913,7 @@ class ClientMethods(ABC):
494
913
  method=get_input_group_names_t.ENDPOINT_METHOD,
495
914
  endpoint=get_input_group_names_t.ENDPOINT_PATH,
496
915
  args=args,
916
+ request_options=_request_options,
497
917
  )
498
918
  return self.do_request(api_request=api_request, return_type=get_input_group_names_t.Data)
499
919
 
@@ -501,16 +921,17 @@ class ClientMethods(ABC):
501
921
  self,
502
922
  *,
503
923
  material_family_id: base_t.ObjectId,
504
- is_parameter: typing.Optional[bool],
505
- offset: typing.Optional[typing.Optional[int]] = None,
506
- limit: typing.Optional[typing.Optional[int]] = None,
924
+ is_parameter: bool | None,
925
+ offset: int | None = None,
926
+ limit: int | None = None,
927
+ _request_options: client_config_t.RequestOptions | None = None,
507
928
  ) -> get_input_names_t.Data:
508
929
  """Gets the name of all inputs for a material family. An input is either an ingredient or process parameter, with metadata and calculations assigned separately
509
930
 
510
931
  :param material_family_id: The material family ID to get the input values from
511
- :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the input ID
932
+ :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the input ID. [Pagination More Info](#pagination)
512
933
  :param is_parameter: Whether to get parameters or ingredients. By default both are returned. When set to true, only parameters are returned, and when set to false, only ingredients are returned
513
- :param limit: The maximum number of results to return. By default this is set to 20,000 and it cannot be set higher than 20,000
934
+ :param limit: The maximum number of results to return. By default this is set to 20,000 and it cannot be set higher than 20,000. [Pagination More Info](#pagination)
514
935
  """
515
936
  args = get_input_names_t.Arguments(
516
937
  material_family_id=material_family_id,
@@ -522,6 +943,7 @@ class ClientMethods(ABC):
522
943
  method=get_input_names_t.ENDPOINT_METHOD,
523
944
  endpoint=get_input_names_t.ENDPOINT_PATH,
524
945
  args=args,
946
+ request_options=_request_options,
525
947
  )
526
948
  return self.do_request(api_request=api_request, return_type=get_input_names_t.Data)
527
949
 
@@ -529,6 +951,7 @@ class ClientMethods(ABC):
529
951
  self,
530
952
  *,
531
953
  input_ids: list[base_t.ObjectId],
954
+ _request_options: client_config_t.RequestOptions | None = None,
532
955
  ) -> get_inputs_data_t.Data:
533
956
  """Gets the details for passed input ids
534
957
 
@@ -541,6 +964,7 @@ class ClientMethods(ABC):
541
964
  method=get_inputs_data_t.ENDPOINT_METHOD,
542
965
  endpoint=get_inputs_data_t.ENDPOINT_PATH,
543
966
  args=args,
967
+ request_options=_request_options,
544
968
  )
545
969
  return self.do_request(api_request=api_request, return_type=get_inputs_data_t.Data)
546
970
 
@@ -548,16 +972,17 @@ class ClientMethods(ABC):
548
972
  self,
549
973
  *,
550
974
  material_family_id: base_t.ObjectId,
551
- output_ids: typing.Optional[list[base_t.ObjectId]] = None,
552
- offset: typing.Optional[int] = None,
553
- limit: typing.Optional[int] = None,
975
+ output_ids: list[base_t.ObjectId] | None = None,
976
+ offset: int | None = None,
977
+ limit: int | None = None,
978
+ _request_options: client_config_t.RequestOptions | None = None,
554
979
  ) -> get_output_data_t.Data:
555
980
  """Gets the attribute, categorization and other metadata associated with a set of outputs
556
981
 
557
982
  :param material_family_id: The material family ID to get the output values from.
558
983
  :param output_ids: The output IDs to get the data from. If this is not filled in, all outputs from a material family will be returned (in paginated form).
559
- :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the output ID
560
- :param limit: The maximum number of results to return. By default this is set to 1,000 and it cannot be set higher than 1,000
984
+ :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the output ID. [Pagination More Info](#pagination)
985
+ :param limit: The maximum number of results to return. By default this is set to 1,000 and it cannot be set higher than 1,000. [Pagination More Info](#pagination)
561
986
  """
562
987
  args = get_output_data_t.Arguments(
563
988
  material_family_id=material_family_id,
@@ -569,6 +994,7 @@ class ClientMethods(ABC):
569
994
  method=get_output_data_t.ENDPOINT_METHOD,
570
995
  endpoint=get_output_data_t.ENDPOINT_PATH,
571
996
  args=args,
997
+ request_options=_request_options,
572
998
  )
573
999
  return self.do_request(api_request=api_request, return_type=get_output_data_t.Data)
574
1000
 
@@ -576,14 +1002,15 @@ class ClientMethods(ABC):
576
1002
  self,
577
1003
  *,
578
1004
  material_family_id: base_t.ObjectId,
579
- offset: typing.Optional[int] = None,
580
- limit: typing.Optional[int] = None,
1005
+ offset: int | None = None,
1006
+ limit: int | None = None,
1007
+ _request_options: client_config_t.RequestOptions | None = None,
581
1008
  ) -> get_output_names_t.Data:
582
1009
  """Gets the name of all outputs for a material family. An output represents a measurement value of any time (numeric, text, curve, etc). This includes calculations based off of other outputs, such as a calculated change over time
583
1010
 
584
1011
  :param material_family_id: The material family ID to get the output values from
585
- :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the output ID
586
- :param limit: The maximum number of results to return. By default this is set to 20,000 and it cannot be set higher than 20,000
1012
+ :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the output ID. [Pagination More Info](#pagination)
1013
+ :param limit: The maximum number of results to return. By default this is set to 20,000 and it cannot be set higher than 20,000. [Pagination More Info](#pagination)
587
1014
  """
588
1015
  args = get_output_names_t.Arguments(
589
1016
  material_family_id=material_family_id,
@@ -594,6 +1021,7 @@ class ClientMethods(ABC):
594
1021
  method=get_output_names_t.ENDPOINT_METHOD,
595
1022
  endpoint=get_output_names_t.ENDPOINT_PATH,
596
1023
  args=args,
1024
+ request_options=_request_options,
597
1025
  )
598
1026
  return self.do_request(api_request=api_request, return_type=get_output_names_t.Data)
599
1027
 
@@ -601,7 +1029,8 @@ class ClientMethods(ABC):
601
1029
  self,
602
1030
  *,
603
1031
  all_material_families: bool,
604
- material_family_id: typing.Optional[base_t.ObjectId],
1032
+ material_family_id: base_t.ObjectId | None,
1033
+ _request_options: client_config_t.RequestOptions | None = None,
605
1034
  ) -> get_projects_t.Data:
606
1035
  """Gets either all projects created in the platform, or the projects associated with a material family ID. Projects are where experiments are placed in Uncountable, similar to folders in a directory structure
607
1036
 
@@ -616,6 +1045,7 @@ class ClientMethods(ABC):
616
1045
  method=get_projects_t.ENDPOINT_METHOD,
617
1046
  endpoint=get_projects_t.ENDPOINT_PATH,
618
1047
  args=args,
1048
+ request_options=_request_options,
619
1049
  )
620
1050
  return self.do_request(api_request=api_request, return_type=get_projects_t.Data)
621
1051
 
@@ -623,14 +1053,15 @@ class ClientMethods(ABC):
623
1053
  self,
624
1054
  *,
625
1055
  project_ids: list[base_t.ObjectId],
626
- offset: typing.Optional[typing.Optional[int]] = None,
627
- limit: typing.Optional[typing.Optional[int]] = None,
1056
+ offset: int | None = None,
1057
+ limit: int | None = None,
1058
+ _request_options: client_config_t.RequestOptions | None = None,
628
1059
  ) -> get_projects_data_t.Data:
629
1060
  """Gets either all data associated with a set of projects created in the platform. Because Uncountables recipe structure is complex, various data values are exploded out to increase efficiency in parsing, and this page is paginated to prevent too large of return values
630
1061
 
631
1062
  :param project_ids: The projects to get the data from
632
- :param offset: Used for pagination. All pagination is done in order of Project ID
633
- :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100
1063
+ :param offset: Used for pagination. All pagination is done in order of Project ID. [Pagination More Info](#pagination)
1064
+ :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100. [Pagination More Info](#pagination)
634
1065
  """
635
1066
  args = get_projects_data_t.Arguments(
636
1067
  project_ids=project_ids,
@@ -641,6 +1072,7 @@ class ClientMethods(ABC):
641
1072
  method=get_projects_data_t.ENDPOINT_METHOD,
642
1073
  endpoint=get_projects_data_t.ENDPOINT_PATH,
643
1074
  args=args,
1075
+ request_options=_request_options,
644
1076
  )
645
1077
  return self.do_request(api_request=api_request, return_type=get_projects_data_t.Data)
646
1078
 
@@ -648,7 +1080,8 @@ class ClientMethods(ABC):
648
1080
  self,
649
1081
  *,
650
1082
  recipe_ids: list[base_t.ObjectId],
651
- calculation_ids: typing.Optional[list[base_t.ObjectId]] = None,
1083
+ calculation_ids: list[base_t.ObjectId] | None = None,
1084
+ _request_options: client_config_t.RequestOptions | None = None,
652
1085
  ) -> get_recipe_calculations_t.Data:
653
1086
  """Gets the calculations for the passed recipes
654
1087
 
@@ -663,6 +1096,7 @@ class ClientMethods(ABC):
663
1096
  method=get_recipe_calculations_t.ENDPOINT_METHOD,
664
1097
  endpoint=get_recipe_calculations_t.ENDPOINT_PATH,
665
1098
  args=args,
1099
+ request_options=_request_options,
666
1100
  )
667
1101
  return self.do_request(api_request=api_request, return_type=get_recipe_calculations_t.Data)
668
1102
 
@@ -671,7 +1105,8 @@ class ClientMethods(ABC):
671
1105
  *,
672
1106
  recipe_ids: list[base_t.ObjectId],
673
1107
  depth: int = 1,
674
- link_types: typing.Optional[list[recipe_links_t.RecipeLinkType]],
1108
+ link_types: list[recipe_links_t.RecipeLinkType] | None,
1109
+ _request_options: client_config_t.RequestOptions | None = None,
675
1110
  ) -> get_recipe_links_t.Data:
676
1111
  """Gets the links for the passed recipes
677
1112
 
@@ -688,6 +1123,7 @@ class ClientMethods(ABC):
688
1123
  method=get_recipe_links_t.ENDPOINT_METHOD,
689
1124
  endpoint=get_recipe_links_t.ENDPOINT_PATH,
690
1125
  args=args,
1126
+ request_options=_request_options,
691
1127
  )
692
1128
  return self.do_request(api_request=api_request, return_type=get_recipe_links_t.Data)
693
1129
 
@@ -695,16 +1131,17 @@ class ClientMethods(ABC):
695
1131
  self,
696
1132
  *,
697
1133
  material_family_id: base_t.ObjectId,
698
- recipe_metadata_ids: typing.Optional[list[base_t.ObjectId]],
699
- offset: typing.Optional[typing.Optional[int]] = None,
700
- limit: typing.Optional[typing.Optional[int]] = None,
1134
+ recipe_metadata_ids: list[base_t.ObjectId] | None,
1135
+ offset: int | None = None,
1136
+ limit: int | None = None,
1137
+ _request_options: client_config_t.RequestOptions | None = None,
701
1138
  ) -> get_recipe_metadata_data_t.Data:
702
1139
  """Gets the recipe metadata. Recipe metadata is data associated with experiments that is not an input, output or calculation, such as a sample ID.
703
1140
 
704
1141
  :param material_family_id: The material family ID to get the recipe metadata values from.
705
1142
  :param recipe_metadata_ids: The recipe metadata IDs to get the data from. If this is not filled in, all metadata from a material family will be returned (in paginated form).
706
- :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the metadata ID
707
- :param limit: The maximum number of results to return. By default this is set to 1,000 and it cannot be set higher than 1,000
1143
+ :param offset: Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the metadata ID. [Pagination More Info](#pagination)
1144
+ :param limit: The maximum number of results to return. By default this is set to 1,000 and it cannot be set higher than 1,000. [Pagination More Info](#pagination)
708
1145
  """
709
1146
  args = get_recipe_metadata_data_t.Arguments(
710
1147
  material_family_id=material_family_id,
@@ -716,6 +1153,7 @@ class ClientMethods(ABC):
716
1153
  method=get_recipe_metadata_data_t.ENDPOINT_METHOD,
717
1154
  endpoint=get_recipe_metadata_data_t.ENDPOINT_PATH,
718
1155
  args=args,
1156
+ request_options=_request_options,
719
1157
  )
720
1158
  return self.do_request(api_request=api_request, return_type=get_recipe_metadata_data_t.Data)
721
1159
 
@@ -723,6 +1161,7 @@ class ClientMethods(ABC):
723
1161
  self,
724
1162
  *,
725
1163
  project_id: base_t.ObjectId,
1164
+ _request_options: client_config_t.RequestOptions | None = None,
726
1165
  ) -> get_recipe_names_t.Data:
727
1166
  """Gets the name of all recipes (or experiments, used as synonyms by Uncountable) for a project. The call external_get_projects can be used to find projects
728
1167
 
@@ -735,6 +1174,7 @@ class ClientMethods(ABC):
735
1174
  method=get_recipe_names_t.ENDPOINT_METHOD,
736
1175
  endpoint=get_recipe_names_t.ENDPOINT_PATH,
737
1176
  args=args,
1177
+ request_options=_request_options,
738
1178
  )
739
1179
  return self.do_request(api_request=api_request, return_type=get_recipe_names_t.Data)
740
1180
 
@@ -742,6 +1182,7 @@ class ClientMethods(ABC):
742
1182
  self,
743
1183
  *,
744
1184
  recipe_output_ids: list[base_t.ObjectId],
1185
+ _request_options: client_config_t.RequestOptions | None = None,
745
1186
  ) -> get_recipe_output_metadata_t.Data:
746
1187
  """Gets the metadata values for the passed recipe outputs
747
1188
 
@@ -754,53 +1195,149 @@ class ClientMethods(ABC):
754
1195
  method=get_recipe_output_metadata_t.ENDPOINT_METHOD,
755
1196
  endpoint=get_recipe_output_metadata_t.ENDPOINT_PATH,
756
1197
  args=args,
1198
+ request_options=_request_options,
757
1199
  )
758
1200
  return self.do_request(api_request=api_request, return_type=get_recipe_output_metadata_t.Data)
759
1201
 
760
1202
  def get_recipes_data(
761
1203
  self,
762
1204
  *,
763
- recipe_ids: typing.Optional[typing.Optional[list[base_t.ObjectId]]] = None,
764
- project_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None,
765
- offset: typing.Optional[typing.Optional[int]] = None,
766
- limit: typing.Optional[typing.Optional[int]] = None,
1205
+ recipe_ids: list[base_t.ObjectId] | None = None,
1206
+ project_id: base_t.ObjectId | None = None,
1207
+ offset: int | None = None,
1208
+ limit: int | None = None,
1209
+ empty_output_behavior: get_recipes_data_t.RecipeOutputInclusion | None = None,
1210
+ _request_options: client_config_t.RequestOptions | None = None,
767
1211
  ) -> get_recipes_data_t.Data:
768
1212
  """Gets all data associated with a set of recipes. Because Uncountables recipe structure is complex, various data values are exploded out to increase efficiency in parsing, and this page is paginated to prevent too large of return values
769
1213
 
770
1214
  :param recipe_ids: The recipes to get the data from. Either these or project_id must be filled in
771
1215
  :param project_id: The projects to get the data from. Either these or recipe_ids must be filled in
772
- :param offset: Used for pagination. All pagination is done in order of Recipe ID
773
- :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100
1216
+ :param offset: Used for pagination. All pagination is done in order of Recipe ID. [Pagination More Info](#pagination)
1217
+ :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100. [Pagination More Info](#pagination)
1218
+ :param empty_output_behavior: Recipe output inclusion behavior for empty outputs. Empty recipe outputs are outputs added to the experiment that do not have a value associated with them.
774
1219
  """
775
1220
  args = get_recipes_data_t.Arguments(
776
1221
  recipe_ids=recipe_ids,
777
1222
  project_id=project_id,
778
1223
  offset=offset,
779
1224
  limit=limit,
1225
+ empty_output_behavior=empty_output_behavior,
780
1226
  )
781
1227
  api_request = APIRequest(
782
1228
  method=get_recipes_data_t.ENDPOINT_METHOD,
783
1229
  endpoint=get_recipes_data_t.ENDPOINT_PATH,
784
1230
  args=args,
1231
+ request_options=_request_options,
785
1232
  )
786
1233
  return self.do_request(api_request=api_request, return_type=get_recipes_data_t.Data)
787
1234
 
1235
+ def grant_entity_permissions(
1236
+ self,
1237
+ *,
1238
+ entity_type: entity_t.LimitedEntityType,
1239
+ entity_key: identifier_t.IdentifierKey,
1240
+ permission_types: list[entity_t.GrantableEntityPermissionType],
1241
+ user_keys: list[identifier_t.IdentifierKey] | None = None,
1242
+ user_group_keys: list[identifier_t.IdentifierKey] | None = None,
1243
+ all_users: bool | None = None,
1244
+ _request_options: client_config_t.RequestOptions | None = None,
1245
+ ) -> grant_entity_permissions_t.Data:
1246
+ """Grant entity permissions to a list of users or user groups or to all users.
1247
+
1248
+ """
1249
+ args = grant_entity_permissions_t.Arguments(
1250
+ entity_type=entity_type,
1251
+ entity_key=entity_key,
1252
+ permission_types=permission_types,
1253
+ user_keys=user_keys,
1254
+ user_group_keys=user_group_keys,
1255
+ all_users=all_users,
1256
+ )
1257
+ api_request = APIRequest(
1258
+ method=grant_entity_permissions_t.ENDPOINT_METHOD,
1259
+ endpoint=grant_entity_permissions_t.ENDPOINT_PATH,
1260
+ args=args,
1261
+ request_options=_request_options,
1262
+ )
1263
+ return self.do_request(api_request=api_request, return_type=grant_entity_permissions_t.Data)
1264
+
1265
+ def invoke_uploader(
1266
+ self,
1267
+ *,
1268
+ uploader_key: identifier_t.IdentifierKey,
1269
+ destination: generic_upload_t.UploadDestination,
1270
+ file_id: base_t.ObjectId | None = None,
1271
+ file_ids: list[base_t.ObjectId] | None = None,
1272
+ _request_options: client_config_t.RequestOptions | None = None,
1273
+ ) -> invoke_uploader_t.Data:
1274
+ """Runs a file through an uploader.
1275
+
1276
+ :param file_id: DEPRECATED: use file_ids
1277
+ """
1278
+ args = invoke_uploader_t.Arguments(
1279
+ file_id=file_id,
1280
+ file_ids=file_ids,
1281
+ uploader_key=uploader_key,
1282
+ destination=destination,
1283
+ )
1284
+ api_request = APIRequest(
1285
+ method=invoke_uploader_t.ENDPOINT_METHOD,
1286
+ endpoint=invoke_uploader_t.ENDPOINT_PATH,
1287
+ args=args,
1288
+ request_options=_request_options,
1289
+ )
1290
+ return self.do_request(api_request=api_request, return_type=invoke_uploader_t.Data)
1291
+
1292
+ def list_aggregate(
1293
+ self,
1294
+ *,
1295
+ config_reference: str,
1296
+ attribute_values: list[list_aggregate_t.AttributeValue] | None = None,
1297
+ offset: int | None = None,
1298
+ limit: int | None = None,
1299
+ _request_options: client_config_t.RequestOptions | None = None,
1300
+ ) -> list_aggregate_t.Data:
1301
+ """Uses a structured loading configuration to list aggregated data from the platform
1302
+
1303
+ :param config_reference: The configuration reference name for the listing config
1304
+ :param attribute_values: Attributes to pass to the configuration for parameterizing filters
1305
+ :param offset: Used for pagination. Pagination is done based on the sorting of the config. [Pagination More Info](#pagination)
1306
+ :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100. [Pagination More Info](#pagination)
1307
+ """
1308
+ args = list_aggregate_t.Arguments(
1309
+ config_reference=config_reference,
1310
+ attribute_values=attribute_values,
1311
+ offset=offset,
1312
+ limit=limit,
1313
+ )
1314
+ api_request = APIRequest(
1315
+ method=list_aggregate_t.ENDPOINT_METHOD,
1316
+ endpoint=list_aggregate_t.ENDPOINT_PATH,
1317
+ args=args,
1318
+ request_options=_request_options,
1319
+ )
1320
+ return self.do_request(api_request=api_request, return_type=list_aggregate_t.Data)
1321
+
788
1322
  def list_entities(
789
1323
  self,
790
1324
  *,
791
- entity_type: entity_t.EntityType,
792
1325
  config_reference: str,
793
- attributes: typing.Optional[dict[OpaqueKey, base_t.JsonValue]] = None,
794
- offset: typing.Optional[typing.Optional[int]] = None,
795
- limit: typing.Optional[typing.Optional[int]] = None,
1326
+ entity_type: entity_t.EntityType | None = None,
1327
+ attributes: dict[OpaqueKey, base_t.JsonValue] | None = None,
1328
+ offset: int | None = None,
1329
+ limit: int | None = None,
1330
+ additional_filter_configs: list[list_entities_t.AdditionalFilterConfig] | None = None,
1331
+ _request_options: client_config_t.RequestOptions | None = None,
796
1332
  ) -> list_entities_t.Data:
797
1333
  """Uses a structured loading configuration to list entities in the system
798
1334
 
799
- :param entity_type: The type of the entities requested, e.g. lab_request, recipe
1335
+ :param entity_type: DEPRECATED: The type of the entities requested, e.g. lab_request, recipe
800
1336
  :param config_reference: The configuration reference name for the listing config
801
1337
  :param attributes: Attributes to pass to the configuration for parameterizing filters
802
- :param offset: Used for pagination. Pagination is done based on the sorting of the config
803
- :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100
1338
+ :param offset: Used for pagination. Pagination is done based on the sorting of the config. [Pagination More Info](#pagination)
1339
+ :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100. [Pagination More Info](#pagination)
1340
+ :param additional_filter_configs: Advanced property: Additional filter configurations to apply to the listing. A maximum of 10 additional filter configs are supported.
804
1341
  """
805
1342
  args = list_entities_t.Arguments(
806
1343
  entity_type=entity_type,
@@ -808,11 +1345,13 @@ class ClientMethods(ABC):
808
1345
  attributes=attributes,
809
1346
  offset=offset,
810
1347
  limit=limit,
1348
+ additional_filter_configs=additional_filter_configs,
811
1349
  )
812
1350
  api_request = APIRequest(
813
1351
  method=list_entities_t.ENDPOINT_METHOD,
814
1352
  endpoint=list_entities_t.ENDPOINT_PATH,
815
1353
  args=args,
1354
+ request_options=_request_options,
816
1355
  )
817
1356
  return self.do_request(api_request=api_request, return_type=list_entities_t.Data)
818
1357
 
@@ -821,15 +1360,16 @@ class ClientMethods(ABC):
821
1360
  *,
822
1361
  spec: id_source_t.IdSourceSpec,
823
1362
  search_label: str,
824
- offset: typing.Optional[typing.Optional[int]] = None,
825
- limit: typing.Optional[typing.Optional[int]] = None,
1363
+ offset: int | None = None,
1364
+ limit: int | None = None,
1365
+ _request_options: client_config_t.RequestOptions | None = None,
826
1366
  ) -> list_id_source_t.Data:
827
1367
  """Lists id and label pairs
828
1368
 
829
1369
  :param spec: The id source spec to use
830
1370
  :param search_label: Text to search within the labels to search matches
831
- :param offset: Used for pagination. Pagination is done based on the sorting of the config
832
- :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100
1371
+ :param offset: Used for pagination. Pagination is done based on the sorting of the config. [Pagination More Info](#pagination)
1372
+ :param limit: The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100. [Pagination More Info](#pagination)
833
1373
  """
834
1374
  args = list_id_source_t.Arguments(
835
1375
  spec=spec,
@@ -841,14 +1381,100 @@ class ClientMethods(ABC):
841
1381
  method=list_id_source_t.ENDPOINT_METHOD,
842
1382
  endpoint=list_id_source_t.ENDPOINT_PATH,
843
1383
  args=args,
1384
+ request_options=_request_options,
844
1385
  )
845
1386
  return self.do_request(api_request=api_request, return_type=list_id_source_t.Data)
846
1387
 
1388
+ def external_lock_entity(
1389
+ self,
1390
+ *,
1391
+ entity_key: identifier_t.IdentifierKey,
1392
+ entity_type: entity_t.EntityType,
1393
+ globally_removable: bool | None = None,
1394
+ _request_options: client_config_t.RequestOptions | None = None,
1395
+ ) -> lock_entity_t.Data:
1396
+ """Lock an entity
1397
+
1398
+ :param entity_key: Identifier for the entity
1399
+ :param globally_removable: Should the lock be removable by any user or just admins
1400
+ """
1401
+ args = lock_entity_t.Arguments(
1402
+ entity_key=entity_key,
1403
+ entity_type=entity_type,
1404
+ globally_removable=globally_removable,
1405
+ )
1406
+ api_request = APIRequest(
1407
+ method=lock_entity_t.ENDPOINT_METHOD,
1408
+ endpoint=lock_entity_t.ENDPOINT_PATH,
1409
+ args=args,
1410
+ request_options=_request_options,
1411
+ )
1412
+ return self.do_request(api_request=api_request, return_type=lock_entity_t.Data)
1413
+
1414
+ def lock_recipes(
1415
+ self,
1416
+ *,
1417
+ type: lock_recipes_t.RecipeLockType = lock_recipes_t.RecipeLockType.ALL,
1418
+ recipes: list[identifier_t.IdentifierKey],
1419
+ globally_removable: bool,
1420
+ lock_samples: bool | None = None,
1421
+ comments: str | None = None,
1422
+ _request_options: client_config_t.RequestOptions | None = None,
1423
+ ) -> lock_recipes_t.Data:
1424
+ """Lock experiments. Experiments will require unlocking to be editable. Edits to the experiments are blocked while they are locked.
1425
+
1426
+ :param type: The type of lock to set.
1427
+ All = both inputs and measurements are locked.
1428
+ Inputs Only = only inputs are locked from editing.
1429
+
1430
+ :param recipes: The recipes to lock, a maximum of 100 can be sent
1431
+ :param globally_removable: If true any user can unlock the experiment. If false the locking user is the only user that can unlock.
1432
+ :param lock_samples: Should associated experiment test samples also be locked.
1433
+ :param comments: Optional comment describing the purpose of locking
1434
+ """
1435
+ args = lock_recipes_t.Arguments(
1436
+ type=type,
1437
+ recipes=recipes,
1438
+ globally_removable=globally_removable,
1439
+ lock_samples=lock_samples,
1440
+ comments=comments,
1441
+ )
1442
+ api_request = APIRequest(
1443
+ method=lock_recipes_t.ENDPOINT_METHOD,
1444
+ endpoint=lock_recipes_t.ENDPOINT_PATH,
1445
+ args=args,
1446
+ request_options=_request_options,
1447
+ )
1448
+ return self.do_request(api_request=api_request, return_type=lock_recipes_t.Data)
1449
+
1450
+ def lookup_entity(
1451
+ self,
1452
+ *,
1453
+ entity_type: entity_t.EntityType,
1454
+ query: lookup_entity_t.LookupEntityQuery,
1455
+ _request_options: client_config_t.RequestOptions | None = None,
1456
+ ) -> lookup_entity_t.Data:
1457
+ """Look up an entity based on an identifier or field values
1458
+
1459
+ """
1460
+ args = lookup_entity_t.Arguments(
1461
+ entity_type=entity_type,
1462
+ query=query,
1463
+ )
1464
+ api_request = APIRequest(
1465
+ method=lookup_entity_t.ENDPOINT_METHOD,
1466
+ endpoint=lookup_entity_t.ENDPOINT_PATH,
1467
+ args=args,
1468
+ request_options=_request_options,
1469
+ )
1470
+ return self.do_request(api_request=api_request, return_type=lookup_entity_t.Data)
1471
+
847
1472
  def match_id_source(
848
1473
  self,
849
1474
  *,
850
1475
  spec: id_source_t.IdSourceSpec,
851
1476
  names: list[str],
1477
+ _request_options: client_config_t.RequestOptions | None = None,
852
1478
  ) -> match_id_source_t.Data:
853
1479
  """Lists id and label pairs
854
1480
 
@@ -863,14 +1489,117 @@ class ClientMethods(ABC):
863
1489
  method=match_id_source_t.ENDPOINT_METHOD,
864
1490
  endpoint=match_id_source_t.ENDPOINT_PATH,
865
1491
  args=args,
1492
+ request_options=_request_options,
866
1493
  )
867
1494
  return self.do_request(api_request=api_request, return_type=match_id_source_t.Data)
868
1495
 
1496
+ def push_notification(
1497
+ self,
1498
+ *,
1499
+ notification_targets: list[notifications_t.NotificationTarget],
1500
+ subject: str,
1501
+ message: str,
1502
+ display_notice: bool = False,
1503
+ entity: entity_t.EntityIdentifier | None = None,
1504
+ notice_configuration: notices_t.NotificationNoticeConfiguration | None = None,
1505
+ _request_options: client_config_t.RequestOptions | None = None,
1506
+ ) -> push_notification_t.Data:
1507
+ """Push a notification to a user or user group
1508
+
1509
+ """
1510
+ args = push_notification_t.Arguments(
1511
+ notification_targets=notification_targets,
1512
+ subject=subject,
1513
+ message=message,
1514
+ entity=entity,
1515
+ display_notice=display_notice,
1516
+ notice_configuration=notice_configuration,
1517
+ )
1518
+ api_request = APIRequest(
1519
+ method=push_notification_t.ENDPOINT_METHOD,
1520
+ endpoint=push_notification_t.ENDPOINT_PATH,
1521
+ args=args,
1522
+ request_options=_request_options,
1523
+ )
1524
+ return self.do_request(api_request=api_request, return_type=push_notification_t.Data)
1525
+
1526
+ def register_sockets_token(
1527
+ self,
1528
+ *,
1529
+ socket_request: sockets_t.SocketTokenRequest,
1530
+ _request_options: client_config_t.RequestOptions | None = None,
1531
+ ) -> register_sockets_token_t.Data:
1532
+ """Request token for connecting to sockets server
1533
+
1534
+ """
1535
+ args = register_sockets_token_t.Arguments(
1536
+ socket_request=socket_request,
1537
+ )
1538
+ api_request = APIRequest(
1539
+ method=register_sockets_token_t.ENDPOINT_METHOD,
1540
+ endpoint=register_sockets_token_t.ENDPOINT_PATH,
1541
+ args=args,
1542
+ request_options=_request_options,
1543
+ )
1544
+ return self.do_request(api_request=api_request, return_type=register_sockets_token_t.Data)
1545
+
1546
+ def remove_recipe_from_project(
1547
+ self,
1548
+ *,
1549
+ recipe_key: identifier_t.IdentifierKey,
1550
+ project_key: identifier_t.IdentifierKey,
1551
+ _request_options: client_config_t.RequestOptions | None = None,
1552
+ ) -> remove_recipe_from_project_t.Data:
1553
+ """Removes a recipe from a project
1554
+
1555
+ :param recipe_key: The identifier key of the recipe to remove from the project
1556
+ :param project_key: The identifier key of the project to remove the recipe from
1557
+ """
1558
+ args = remove_recipe_from_project_t.Arguments(
1559
+ recipe_key=recipe_key,
1560
+ project_key=project_key,
1561
+ )
1562
+ api_request = APIRequest(
1563
+ method=remove_recipe_from_project_t.ENDPOINT_METHOD,
1564
+ endpoint=remove_recipe_from_project_t.ENDPOINT_PATH,
1565
+ args=args,
1566
+ request_options=_request_options,
1567
+ )
1568
+ return self.do_request(api_request=api_request, return_type=remove_recipe_from_project_t.Data)
1569
+
1570
+ def remove_recipe_link(
1571
+ self,
1572
+ *,
1573
+ recipe_from_key: identifier_t.IdentifierKey,
1574
+ recipe_to_key: identifier_t.IdentifierKey,
1575
+ link_type: typing.Literal[recipe_links_t.RecipeLinkType.CHILD] | typing.Literal[recipe_links_t.RecipeLinkType.CONTROL] | typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK] | typing.Literal[recipe_links_t.RecipeLinkType.PREVIOUS_EXPERIMENT],
1576
+ _request_options: client_config_t.RequestOptions | None = None,
1577
+ ) -> remove_recipe_link_t.Data:
1578
+ """Remove a link between two recipes. Skip if the link doesn't already exist
1579
+
1580
+ :param recipe_from_key: Identifier for the recipe the link comes from
1581
+ :param recipe_to_key: Identifier for the recipe the link goes to
1582
+ :param link_type: The type of link being removed
1583
+ """
1584
+ args = remove_recipe_link_t.Arguments(
1585
+ recipe_from_key=recipe_from_key,
1586
+ recipe_to_key=recipe_to_key,
1587
+ link_type=link_type,
1588
+ )
1589
+ api_request = APIRequest(
1590
+ method=remove_recipe_link_t.ENDPOINT_METHOD,
1591
+ endpoint=remove_recipe_link_t.ENDPOINT_PATH,
1592
+ args=args,
1593
+ request_options=_request_options,
1594
+ )
1595
+ return self.do_request(api_request=api_request, return_type=remove_recipe_link_t.Data)
1596
+
869
1597
  def resolve_entity_ids(
870
1598
  self,
871
1599
  *,
872
- entity_ids: list[typing.Union[str, base_t.ObjectId]],
1600
+ entity_ids: list[str | base_t.ObjectId],
873
1601
  entity_type: entity_t.EntityType,
1602
+ _request_options: client_config_t.RequestOptions | None = None,
874
1603
  ) -> resolve_entity_ids_t.Data:
875
1604
  """Gets the names for passed in ids
876
1605
 
@@ -885,6 +1614,7 @@ class ClientMethods(ABC):
885
1614
  method=resolve_entity_ids_t.ENDPOINT_METHOD,
886
1615
  endpoint=resolve_entity_ids_t.ENDPOINT_PATH,
887
1616
  args=args,
1617
+ request_options=_request_options,
888
1618
  )
889
1619
  return self.do_request(api_request=api_request, return_type=resolve_entity_ids_t.Data)
890
1620
 
@@ -892,6 +1622,7 @@ class ClientMethods(ABC):
892
1622
  self,
893
1623
  *,
894
1624
  requested_conditions: list[resolve_output_conditions_t.ConditionRequest],
1625
+ _request_options: client_config_t.RequestOptions | None = None,
895
1626
  ) -> resolve_output_conditions_t.Data:
896
1627
  """For the provided set of condition parameter id and values, returns the existing or newly created output condition id for that value and id pair.
897
1628
 
@@ -903,6 +1634,7 @@ class ClientMethods(ABC):
903
1634
  method=resolve_output_conditions_t.ENDPOINT_METHOD,
904
1635
  endpoint=resolve_output_conditions_t.ENDPOINT_PATH,
905
1636
  args=args,
1637
+ request_options=_request_options,
906
1638
  )
907
1639
  return self.do_request(api_request=api_request, return_type=resolve_output_conditions_t.Data)
908
1640
 
@@ -910,7 +1642,8 @@ class ClientMethods(ABC):
910
1642
  self,
911
1643
  *,
912
1644
  trigger_ref_name: str,
913
- entity: typing.Optional[entity_t.Entity] = None,
1645
+ entity: entity_t.Entity | None = None,
1646
+ _request_options: client_config_t.RequestOptions | None = None,
914
1647
  ) -> run_trigger_t.Data:
915
1648
  """Runs a trigger. Requires admin access
916
1649
 
@@ -923,6 +1656,7 @@ class ClientMethods(ABC):
923
1656
  method=run_trigger_t.ENDPOINT_METHOD,
924
1657
  endpoint=run_trigger_t.ENDPOINT_PATH,
925
1658
  args=args,
1659
+ request_options=_request_options,
926
1660
  )
927
1661
  return self.do_request(api_request=api_request, return_type=run_trigger_t.Data)
928
1662
 
@@ -932,8 +1666,9 @@ class ClientMethods(ABC):
932
1666
  scope: set_core_permissions_t.PermissionsScope,
933
1667
  permissions_types: list[permissions_t.CorePermissionType],
934
1668
  update_type: post_base_t.UpdateType,
935
- user_group_ids: typing.Optional[list[int]] = None,
936
- user_ids: typing.Optional[list[int]] = None,
1669
+ user_group_ids: list[int] | None = None,
1670
+ user_ids: list[int] | None = None,
1671
+ _request_options: client_config_t.RequestOptions | None = None,
937
1672
  ) -> set_core_permissions_t.Data:
938
1673
  """Sets recipe related permissions
939
1674
 
@@ -953,13 +1688,39 @@ class ClientMethods(ABC):
953
1688
  method=set_core_permissions_t.ENDPOINT_METHOD,
954
1689
  endpoint=set_core_permissions_t.ENDPOINT_PATH,
955
1690
  args=args,
1691
+ request_options=_request_options,
956
1692
  )
957
1693
  return self.do_request(api_request=api_request, return_type=set_core_permissions_t.Data)
958
1694
 
1695
+ def set_entity_field_values(
1696
+ self,
1697
+ *,
1698
+ entity_identifier: entity_t.EntityIdentifier,
1699
+ field_values: list[field_values_t.FieldArgumentValue],
1700
+ _request_options: client_config_t.RequestOptions | None = None,
1701
+ ) -> set_entity_field_values_t.Data:
1702
+ """Sets field values for an entity
1703
+
1704
+ :param entity_identifier: Entity to update
1705
+ :param field_values: Field values to set
1706
+ """
1707
+ args = set_entity_field_values_t.Arguments(
1708
+ entity_identifier=entity_identifier,
1709
+ field_values=field_values,
1710
+ )
1711
+ api_request = APIRequest(
1712
+ method=set_entity_field_values_t.ENDPOINT_METHOD,
1713
+ endpoint=set_entity_field_values_t.ENDPOINT_PATH,
1714
+ args=args,
1715
+ request_options=_request_options,
1716
+ )
1717
+ return self.do_request(api_request=api_request, return_type=set_entity_field_values_t.Data)
1718
+
959
1719
  def set_input_attribute_values(
960
1720
  self,
961
1721
  *,
962
1722
  attribute_values: list[set_input_attribute_values_t.InputAttributeValue],
1723
+ _request_options: client_config_t.RequestOptions | None = None,
963
1724
  ) -> set_input_attribute_values_t.Data:
964
1725
  """Sets attribute values for an input
965
1726
 
@@ -972,13 +1733,93 @@ class ClientMethods(ABC):
972
1733
  method=set_input_attribute_values_t.ENDPOINT_METHOD,
973
1734
  endpoint=set_input_attribute_values_t.ENDPOINT_PATH,
974
1735
  args=args,
1736
+ request_options=_request_options,
975
1737
  )
976
1738
  return self.do_request(api_request=api_request, return_type=set_input_attribute_values_t.Data)
977
1739
 
1740
+ def external_set_input_category(
1741
+ self,
1742
+ *,
1743
+ input_key: identifier_t.IdentifierKey,
1744
+ category_id: int | None,
1745
+ material_family_ids: list[int] | None = None,
1746
+ _request_options: client_config_t.RequestOptions | None = None,
1747
+ ) -> set_input_category_t.Data:
1748
+ """Sets subcategories for an input
1749
+
1750
+ :param input_key: Identifier for the input
1751
+ :param category_id: The category identifier to set. Null unsets the current category.
1752
+ :param material_family_ids: The material families to perform the update in
1753
+ """
1754
+ args = set_input_category_t.Arguments(
1755
+ input_key=input_key,
1756
+ category_id=category_id,
1757
+ material_family_ids=material_family_ids,
1758
+ )
1759
+ api_request = APIRequest(
1760
+ method=set_input_category_t.ENDPOINT_METHOD,
1761
+ endpoint=set_input_category_t.ENDPOINT_PATH,
1762
+ args=args,
1763
+ request_options=_request_options,
1764
+ )
1765
+ return self.do_request(api_request=api_request, return_type=set_input_category_t.Data)
1766
+
1767
+ def external_set_input_subcategories(
1768
+ self,
1769
+ *,
1770
+ input_key: identifier_t.IdentifierKey,
1771
+ subcategory_ids: list[int],
1772
+ update_type: post_base_t.UpdateType,
1773
+ _request_options: client_config_t.RequestOptions | None = None,
1774
+ ) -> set_input_subcategories_t.Data:
1775
+ """Sets subcategories for an input
1776
+
1777
+ :param input_key: Identifier for the input
1778
+ :param subcategory_ids: The subcategory identifiers to set
1779
+ :param update_type: The type of update to perform
1780
+ """
1781
+ args = set_input_subcategories_t.Arguments(
1782
+ input_key=input_key,
1783
+ subcategory_ids=subcategory_ids,
1784
+ update_type=update_type,
1785
+ )
1786
+ api_request = APIRequest(
1787
+ method=set_input_subcategories_t.ENDPOINT_METHOD,
1788
+ endpoint=set_input_subcategories_t.ENDPOINT_PATH,
1789
+ args=args,
1790
+ request_options=_request_options,
1791
+ )
1792
+ return self.do_request(api_request=api_request, return_type=set_input_subcategories_t.Data)
1793
+
1794
+ def set_intermediate_type(
1795
+ self,
1796
+ *,
1797
+ input_key: identifier_t.IdentifierKey,
1798
+ intermediate_type: set_intermediate_type_t.IntermediateType,
1799
+ _request_options: client_config_t.RequestOptions | None = None,
1800
+ ) -> set_intermediate_type_t.Data:
1801
+ """Sets the type of an intermediate ingredient.
1802
+
1803
+ :param input_key: The identifier key of the intermediate ingredient
1804
+ :param intermediate_type: The new type of the intermediate ingredient
1805
+ """
1806
+ args = set_intermediate_type_t.Arguments(
1807
+ input_key=input_key,
1808
+ intermediate_type=intermediate_type,
1809
+ )
1810
+ api_request = APIRequest(
1811
+ method=set_intermediate_type_t.ENDPOINT_METHOD,
1812
+ endpoint=set_intermediate_type_t.ENDPOINT_PATH,
1813
+ args=args,
1814
+ request_options=_request_options,
1815
+ )
1816
+ return self.do_request(api_request=api_request, return_type=set_intermediate_type_t.Data)
1817
+
978
1818
  def set_recipe_inputs(
979
1819
  self,
980
1820
  *,
981
1821
  input_data: list[set_recipe_inputs_t.RecipeInputValue],
1822
+ _request_options: client_config_t.RequestOptions | None = None,
982
1823
  ) -> set_recipe_inputs_t.Data:
983
1824
  """Sets inputs values for an experiment. Values set can be numeric, text or categorical types in the Uncountable system
984
1825
 
@@ -991,6 +1832,7 @@ class ClientMethods(ABC):
991
1832
  method=set_recipe_inputs_t.ENDPOINT_METHOD,
992
1833
  endpoint=set_recipe_inputs_t.ENDPOINT_PATH,
993
1834
  args=args,
1835
+ request_options=_request_options,
994
1836
  )
995
1837
  return self.do_request(api_request=api_request, return_type=set_recipe_inputs_t.Data)
996
1838
 
@@ -999,6 +1841,7 @@ class ClientMethods(ABC):
999
1841
  *,
1000
1842
  recipe_key: identifier_t.IdentifierKey,
1001
1843
  recipe_metadata: list[recipe_metadata_t.MetadataValue],
1844
+ _request_options: client_config_t.RequestOptions | None = None,
1002
1845
  ) -> set_recipe_metadata_t.Data:
1003
1846
  """Set metadata values on a recipe
1004
1847
 
@@ -1013,13 +1856,57 @@ class ClientMethods(ABC):
1013
1856
  method=set_recipe_metadata_t.ENDPOINT_METHOD,
1014
1857
  endpoint=set_recipe_metadata_t.ENDPOINT_PATH,
1015
1858
  args=args,
1859
+ request_options=_request_options,
1016
1860
  )
1017
1861
  return self.do_request(api_request=api_request, return_type=set_recipe_metadata_t.Data)
1018
1862
 
1863
+ def set_recipe_output_annotations(
1864
+ self,
1865
+ *,
1866
+ updates: list[set_recipe_output_annotations_t.RecipeOutputUpdateAnnotations],
1867
+ _request_options: client_config_t.RequestOptions | None = None,
1868
+ ) -> set_recipe_output_annotations_t.Data:
1869
+ """Update annotations for an experiments outputs
1870
+
1871
+ :param updates: The output edits to perform. Must be at most 100 entries long
1872
+ """
1873
+ args = set_recipe_output_annotations_t.Arguments(
1874
+ updates=updates,
1875
+ )
1876
+ api_request = APIRequest(
1877
+ method=set_recipe_output_annotations_t.ENDPOINT_METHOD,
1878
+ endpoint=set_recipe_output_annotations_t.ENDPOINT_PATH,
1879
+ args=args,
1880
+ request_options=_request_options,
1881
+ )
1882
+ return self.do_request(api_request=api_request, return_type=set_recipe_output_annotations_t.Data)
1883
+
1884
+ def set_recipe_output_file(
1885
+ self,
1886
+ *,
1887
+ output_file_data: set_recipe_output_file_t.RecipeOutputFileValue,
1888
+ _request_options: client_config_t.RequestOptions | None = None,
1889
+ ) -> set_recipe_output_file_t.Data:
1890
+ """Sets output file value for an experiment. Include a single file as part of the FormData of the request with the filename as the key
1891
+
1892
+ :param output_file_data: The output file to set
1893
+ """
1894
+ args = set_recipe_output_file_t.Arguments(
1895
+ output_file_data=output_file_data,
1896
+ )
1897
+ api_request = APIRequest(
1898
+ method=set_recipe_output_file_t.ENDPOINT_METHOD,
1899
+ endpoint=set_recipe_output_file_t.ENDPOINT_PATH,
1900
+ args=args,
1901
+ request_options=_request_options,
1902
+ )
1903
+ return self.do_request(api_request=api_request, return_type=set_recipe_output_file_t.Data)
1904
+
1019
1905
  def set_recipe_outputs(
1020
1906
  self,
1021
1907
  *,
1022
1908
  output_data: list[set_recipe_outputs_t.RecipeOutputValue],
1909
+ _request_options: client_config_t.RequestOptions | None = None,
1023
1910
  ) -> set_recipe_outputs_t.Data:
1024
1911
  """Sets output values for an experiment. Values set can be numeric, text or categorical types in the Uncountable system
1025
1912
 
@@ -1032,6 +1919,7 @@ class ClientMethods(ABC):
1032
1919
  method=set_recipe_outputs_t.ENDPOINT_METHOD,
1033
1920
  endpoint=set_recipe_outputs_t.ENDPOINT_PATH,
1034
1921
  args=args,
1922
+ request_options=_request_options,
1035
1923
  )
1036
1924
  return self.do_request(api_request=api_request, return_type=set_recipe_outputs_t.Data)
1037
1925
 
@@ -1040,6 +1928,7 @@ class ClientMethods(ABC):
1040
1928
  *,
1041
1929
  recipe_key: identifier_t.IdentifierKey,
1042
1930
  recipe_tag_update: set_recipe_tags_t.RecipeTagUpdate,
1931
+ _request_options: client_config_t.RequestOptions | None = None,
1043
1932
  ) -> set_recipe_tags_t.Data:
1044
1933
  """Modifies recipes tags for a recipe
1045
1934
 
@@ -1054,14 +1943,46 @@ class ClientMethods(ABC):
1054
1943
  method=set_recipe_tags_t.ENDPOINT_METHOD,
1055
1944
  endpoint=set_recipe_tags_t.ENDPOINT_PATH,
1056
1945
  args=args,
1946
+ request_options=_request_options,
1057
1947
  )
1058
1948
  return self.do_request(api_request=api_request, return_type=set_recipe_tags_t.Data)
1059
1949
 
1950
+ def set_recipe_total(
1951
+ self,
1952
+ *,
1953
+ recipe_key: identifier_t.IdentifierKey,
1954
+ value: set_recipe_total_t.ValueNumeric,
1955
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier | None = None,
1956
+ calculation_key: identifier_t.IdentifierKey | None = None,
1957
+ _request_options: client_config_t.RequestOptions | None = None,
1958
+ ) -> set_recipe_total_t.Data:
1959
+ """Updates the Set Total value for a recipe or one of its workflow steps
1960
+
1961
+ :param recipe_key: Identifier for the recipe
1962
+ :param recipe_workflow_step_identifier: Identifier for the recipe workflow step
1963
+ :param value: The quantity in mass, volume, or moles to set for the total
1964
+ :param calculation_key: The linked basis calculation to set
1965
+ """
1966
+ args = set_recipe_total_t.Arguments(
1967
+ recipe_key=recipe_key,
1968
+ recipe_workflow_step_identifier=recipe_workflow_step_identifier,
1969
+ value=value,
1970
+ calculation_key=calculation_key,
1971
+ )
1972
+ api_request = APIRequest(
1973
+ method=set_recipe_total_t.ENDPOINT_METHOD,
1974
+ endpoint=set_recipe_total_t.ENDPOINT_PATH,
1975
+ args=args,
1976
+ request_options=_request_options,
1977
+ )
1978
+ return self.do_request(api_request=api_request, return_type=set_recipe_total_t.Data)
1979
+
1060
1980
  def set_values(
1061
1981
  self,
1062
1982
  *,
1063
1983
  entity: entity_t.Entity,
1064
1984
  values: list[field_values_t.ArgumentValueRefName],
1985
+ _request_options: client_config_t.RequestOptions | None = None,
1065
1986
  ) -> set_values_t.Data:
1066
1987
  """Sets field values for an entity
1067
1988
 
@@ -1074,25 +1995,186 @@ class ClientMethods(ABC):
1074
1995
  method=set_values_t.ENDPOINT_METHOD,
1075
1996
  endpoint=set_values_t.ENDPOINT_PATH,
1076
1997
  args=args,
1998
+ request_options=_request_options,
1077
1999
  )
1078
2000
  return self.do_request(api_request=api_request, return_type=set_values_t.Data)
1079
2001
 
1080
2002
  def transition_entity_phase(
1081
2003
  self,
1082
2004
  *,
1083
- entity: entity_t.Entity,
1084
2005
  transition: transition_entity_phase_t.TransitionIdentifier,
2006
+ entity: entity_t.Entity | None = None,
2007
+ entity_identifier: entity_t.EntityIdentifier | None = None,
2008
+ _request_options: client_config_t.RequestOptions | None = None,
1085
2009
  ) -> transition_entity_phase_t.Data:
1086
2010
  """Transitions an entity from one phase to another
1087
2011
 
2012
+ :param entity: Entity to transition. If entity_identifier is provided, this should be omitted.
2013
+ :param entity_identifier: Identifier of the entity to transition. If entity is provided, this should be omitted.
2014
+ :param transition: Identifier of the transition to perform
1088
2015
  """
1089
2016
  args = transition_entity_phase_t.Arguments(
1090
2017
  entity=entity,
2018
+ entity_identifier=entity_identifier,
1091
2019
  transition=transition,
1092
2020
  )
1093
2021
  api_request = APIRequest(
1094
2022
  method=transition_entity_phase_t.ENDPOINT_METHOD,
1095
2023
  endpoint=transition_entity_phase_t.ENDPOINT_PATH,
1096
2024
  args=args,
2025
+ request_options=_request_options,
1097
2026
  )
1098
2027
  return self.do_request(api_request=api_request, return_type=transition_entity_phase_t.Data)
2028
+
2029
+ def unarchive_recipes(
2030
+ self,
2031
+ *,
2032
+ recipes: list[identifier_t.IdentifierKey],
2033
+ _request_options: client_config_t.RequestOptions | None = None,
2034
+ ) -> unarchive_recipes_t.Data:
2035
+ """Unarchive/restore the provided recipes
2036
+
2037
+ :param recipes: Identifier for the recipe
2038
+ """
2039
+ args = unarchive_recipes_t.Arguments(
2040
+ recipes=recipes,
2041
+ )
2042
+ api_request = APIRequest(
2043
+ method=unarchive_recipes_t.ENDPOINT_METHOD,
2044
+ endpoint=unarchive_recipes_t.ENDPOINT_PATH,
2045
+ args=args,
2046
+ request_options=_request_options,
2047
+ )
2048
+ return self.do_request(api_request=api_request, return_type=unarchive_recipes_t.Data)
2049
+
2050
+ def external_unlock_entity(
2051
+ self,
2052
+ *,
2053
+ entity_key: identifier_t.IdentifierKey,
2054
+ entity_type: entity_t.EntityType,
2055
+ _request_options: client_config_t.RequestOptions | None = None,
2056
+ ) -> unlock_entity_t.Data:
2057
+ """Unlock an entity
2058
+
2059
+ :param entity_key: Identifier for the entity
2060
+ """
2061
+ args = unlock_entity_t.Arguments(
2062
+ entity_key=entity_key,
2063
+ entity_type=entity_type,
2064
+ )
2065
+ api_request = APIRequest(
2066
+ method=unlock_entity_t.ENDPOINT_METHOD,
2067
+ endpoint=unlock_entity_t.ENDPOINT_PATH,
2068
+ args=args,
2069
+ request_options=_request_options,
2070
+ )
2071
+ return self.do_request(api_request=api_request, return_type=unlock_entity_t.Data)
2072
+
2073
+ def unlock_recipes(
2074
+ self,
2075
+ *,
2076
+ type: unlock_recipes_t.RecipeUnlockType = unlock_recipes_t.RecipeUnlockType.STANDARD,
2077
+ recipes: list[identifier_t.IdentifierKey],
2078
+ unlock_samples: bool | None = None,
2079
+ _request_options: client_config_t.RequestOptions | None = None,
2080
+ ) -> unlock_recipes_t.Data:
2081
+ """Unlock experiments. Experiments will edtiable after unlocking if they are currently locked.
2082
+
2083
+ :param type: The method to unlock recipes. Default is standard.
2084
+ :param recipes: The recipes to unlock, a maximum of 100 can be sent
2085
+ :param unlock_samples: Should associated experiment test samples also be unlocked.
2086
+ """
2087
+ args = unlock_recipes_t.Arguments(
2088
+ type=type,
2089
+ recipes=recipes,
2090
+ unlock_samples=unlock_samples,
2091
+ )
2092
+ api_request = APIRequest(
2093
+ method=unlock_recipes_t.ENDPOINT_METHOD,
2094
+ endpoint=unlock_recipes_t.ENDPOINT_PATH,
2095
+ args=args,
2096
+ request_options=_request_options,
2097
+ )
2098
+ return self.do_request(api_request=api_request, return_type=unlock_recipes_t.Data)
2099
+
2100
+ def update_entity_material_families(
2101
+ self,
2102
+ *,
2103
+ entity_key: identifier_t.IdentifierKey,
2104
+ entity_type: typing.Literal[entity_t.EntityType.RECIPE_METADATA] | typing.Literal[entity_t.EntityType.INGREDIENT] | typing.Literal[entity_t.EntityType.OUTPUT] | typing.Literal[entity_t.EntityType.CONDITION_PARAMETER] | typing.Literal[entity_t.EntityType.INGREDIENT_ATTRIBUTE] | typing.Literal[entity_t.EntityType.INGREDIENT_CATEGORY_ALL],
2105
+ material_family_ids: list[base_t.ObjectId],
2106
+ update_type: post_base_t.UpdateType,
2107
+ _request_options: client_config_t.RequestOptions | None = None,
2108
+ ) -> update_entity_material_families_t.Data:
2109
+ """Updates the material families that the entity is available in
2110
+
2111
+ :param entity_key: The identifier for the entity to update across material families
2112
+ :param entity_type: The type of the entities requested
2113
+ :param material_family_ids: The material families to update
2114
+ :param update_type: The type of update to make
2115
+ """
2116
+ args = update_entity_material_families_t.Arguments(
2117
+ entity_key=entity_key,
2118
+ entity_type=entity_type,
2119
+ material_family_ids=material_family_ids,
2120
+ update_type=update_type,
2121
+ )
2122
+ api_request = APIRequest(
2123
+ method=update_entity_material_families_t.ENDPOINT_METHOD,
2124
+ endpoint=update_entity_material_families_t.ENDPOINT_PATH,
2125
+ args=args,
2126
+ request_options=_request_options,
2127
+ )
2128
+ return self.do_request(api_request=api_request, return_type=update_entity_material_families_t.Data)
2129
+
2130
+ def upsert_condition_match(
2131
+ self,
2132
+ *,
2133
+ explicit_name: bool = False,
2134
+ name: str | None = None,
2135
+ condition_parameters: list[upsert_condition_match_t.ConditionParameter] | None = None,
2136
+ output_conditions: list[identifier_t.IdentifierKey] | None = None,
2137
+ existing_condition_match: identifier_t.IdentifierKey | None = None,
2138
+ _request_options: client_config_t.RequestOptions | None = None,
2139
+ ) -> upsert_condition_match_t.Data:
2140
+ """Creates or updates condition match
2141
+
2142
+ """
2143
+ args = upsert_condition_match_t.Arguments(
2144
+ name=name,
2145
+ condition_parameters=condition_parameters,
2146
+ output_conditions=output_conditions,
2147
+ explicit_name=explicit_name,
2148
+ existing_condition_match=existing_condition_match,
2149
+ )
2150
+ api_request = APIRequest(
2151
+ method=upsert_condition_match_t.ENDPOINT_METHOD,
2152
+ endpoint=upsert_condition_match_t.ENDPOINT_PATH,
2153
+ args=args,
2154
+ request_options=_request_options,
2155
+ )
2156
+ return self.do_request(api_request=api_request, return_type=upsert_condition_match_t.Data)
2157
+
2158
+ def upsert_field_options(
2159
+ self,
2160
+ *,
2161
+ option_set_key: identifier_t.IdentifierKey,
2162
+ field_options: list[upsert_field_options_t.FieldOption],
2163
+ _request_options: client_config_t.RequestOptions | None = None,
2164
+ ) -> upsert_field_options_t.Data:
2165
+ """Creates or updates field options for an option set
2166
+
2167
+ :param option_set_key: Identifier for the field option set
2168
+ :param field_options: Field options to upsert
2169
+ """
2170
+ args = upsert_field_options_t.Arguments(
2171
+ option_set_key=option_set_key,
2172
+ field_options=field_options,
2173
+ )
2174
+ api_request = APIRequest(
2175
+ method=upsert_field_options_t.ENDPOINT_METHOD,
2176
+ endpoint=upsert_field_options_t.ENDPOINT_PATH,
2177
+ args=args,
2178
+ request_options=_request_options,
2179
+ )
2180
+ return self.do_request(api_request=api_request, return_type=upsert_field_options_t.Data)