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
@@ -0,0 +1,251 @@
1
+ import functools
2
+ import json
3
+ import os
4
+ import time
5
+ import traceback
6
+ import typing
7
+ from contextlib import contextmanager
8
+ from enum import StrEnum
9
+ from typing import Generator, assert_never, cast
10
+
11
+ from opentelemetry import _logs, trace
12
+ from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
13
+ from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
14
+ from opentelemetry.sdk._logs import Logger as OTELLogger
15
+ from opentelemetry.sdk._logs import (
16
+ LoggerProvider,
17
+ LogRecord,
18
+ )
19
+ from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, ConsoleLogExporter
20
+ from opentelemetry.sdk.resources import Attributes, Resource
21
+ from opentelemetry.sdk.trace import TracerProvider
22
+ from opentelemetry.sdk.trace.export import (
23
+ SimpleSpanProcessor,
24
+ )
25
+ from opentelemetry.trace import DEFAULT_TRACE_OPTIONS, Span, Tracer
26
+
27
+ from uncountable.core.environment import (
28
+ get_otel_enabled,
29
+ get_server_env,
30
+ get_version,
31
+ )
32
+ from uncountable.types import base_t, job_definition_t
33
+
34
+
35
+ def _cast_attributes(attributes: dict[str, base_t.JsonValue]) -> Attributes:
36
+ return cast(Attributes, attributes)
37
+
38
+
39
+ def one_line_formatter(record: LogRecord) -> str:
40
+ json_data = record.to_json()
41
+ return json.dumps(json.loads(json_data), separators=(",", ":")) + "\n"
42
+
43
+
44
+ @functools.cache
45
+ def get_otel_resource() -> Resource:
46
+ attributes: dict[str, base_t.JsonValue] = {
47
+ "service.name": "integration-server",
48
+ "sdk.version": get_version(),
49
+ }
50
+ unc_version = os.environ.get("UNC_VERSION")
51
+ if unc_version is not None:
52
+ attributes["service.version"] = unc_version
53
+ unc_env = get_server_env()
54
+ if unc_env is not None:
55
+ attributes["deployment.environment"] = unc_env
56
+ resource = Resource.create(attributes=_cast_attributes(attributes))
57
+ return resource
58
+
59
+
60
+ @functools.cache
61
+ def get_otel_tracer() -> Tracer:
62
+ provider = TracerProvider(resource=get_otel_resource())
63
+ if get_otel_enabled():
64
+ provider.add_span_processor(SimpleSpanProcessor(OTLPSpanExporter()))
65
+ trace.set_tracer_provider(provider)
66
+ return provider.get_tracer("integration.telemetry")
67
+
68
+
69
+ @functools.cache
70
+ def get_otel_logger() -> OTELLogger:
71
+ provider = LoggerProvider(resource=get_otel_resource())
72
+ provider.add_log_record_processor(
73
+ BatchLogRecordProcessor(ConsoleLogExporter(formatter=one_line_formatter))
74
+ )
75
+ if get_otel_enabled():
76
+ provider.add_log_record_processor(BatchLogRecordProcessor(OTLPLogExporter()))
77
+ _logs.set_logger_provider(provider)
78
+ return provider.get_logger("integration.telemetry")
79
+
80
+
81
+ class LogSeverity(StrEnum):
82
+ INFO = "Info"
83
+ WARN = "Warn"
84
+ ERROR = "Error"
85
+
86
+
87
+ class Logger:
88
+ current_span: Span
89
+
90
+ def __init__(self, base_span: Span) -> None:
91
+ self.current_span = base_span
92
+
93
+ @property
94
+ def current_span_id(self) -> int:
95
+ return self.current_span.get_span_context().span_id
96
+
97
+ @property
98
+ def current_trace_id(self) -> int | None:
99
+ return self.current_span.get_span_context().trace_id
100
+
101
+ def _patch_attributes(
102
+ self,
103
+ attributes: Attributes | None,
104
+ *,
105
+ message: str | None = None,
106
+ severity: LogSeverity | None = None,
107
+ ) -> Attributes:
108
+ patched_attributes = {**(attributes if attributes is not None else {})}
109
+ if message is not None:
110
+ patched_attributes["message"] = message
111
+ elif "body" in patched_attributes:
112
+ patched_attributes["message"] = patched_attributes["body"]
113
+
114
+ if severity is not None:
115
+ patched_attributes["status"] = severity.lower()
116
+ elif "severity_text" in patched_attributes and isinstance(
117
+ patched_attributes["severity_text"], str
118
+ ):
119
+ patched_attributes["status"] = patched_attributes["severity_text"].lower()
120
+
121
+ return patched_attributes
122
+
123
+ def _emit_log(
124
+ self, message: str, *, severity: LogSeverity, attributes: Attributes | None
125
+ ) -> None:
126
+ otel_logger = get_otel_logger()
127
+ log_record = LogRecord(
128
+ body=message,
129
+ severity_text=severity,
130
+ timestamp=time.time_ns(),
131
+ attributes=self._patch_attributes(
132
+ message=message, severity=severity, attributes=attributes
133
+ ),
134
+ span_id=self.current_span_id,
135
+ trace_id=self.current_trace_id,
136
+ trace_flags=DEFAULT_TRACE_OPTIONS,
137
+ severity_number=_logs.SeverityNumber.UNSPECIFIED,
138
+ resource=get_otel_resource(),
139
+ )
140
+ otel_logger.emit(log_record)
141
+
142
+ def log_info(self, message: str, *, attributes: Attributes | None = None) -> None:
143
+ self._emit_log(
144
+ message=message, severity=LogSeverity.INFO, attributes=attributes
145
+ )
146
+
147
+ def log_warning(
148
+ self, message: str, *, attributes: Attributes | None = None
149
+ ) -> None:
150
+ self._emit_log(
151
+ message=message, severity=LogSeverity.WARN, attributes=attributes
152
+ )
153
+
154
+ def log_error(self, message: str, *, attributes: Attributes | None = None) -> None:
155
+ self._emit_log(
156
+ message=message, severity=LogSeverity.ERROR, attributes=attributes
157
+ )
158
+
159
+ def log_exception(
160
+ self,
161
+ exception: BaseException,
162
+ *,
163
+ message: str | None = None,
164
+ attributes: Attributes | None = None,
165
+ ) -> None:
166
+ traceback_str = "".join(traceback.format_exception(exception))
167
+ patched_attributes = self._patch_attributes(
168
+ message=message, severity=LogSeverity.ERROR, attributes=attributes
169
+ )
170
+ self.current_span.record_exception(
171
+ exception=exception, attributes=patched_attributes
172
+ )
173
+ self.log_error(
174
+ message=f"error: {message}\nexception: {exception}{traceback_str}",
175
+ attributes=patched_attributes,
176
+ )
177
+
178
+ @contextmanager
179
+ def push_scope(
180
+ self, scope_name: str, *, attributes: Attributes | None = None
181
+ ) -> Generator[typing.Self, None, None]:
182
+ with get_otel_tracer().start_as_current_span(
183
+ scope_name, attributes=self._patch_attributes(attributes)
184
+ ):
185
+ yield self
186
+
187
+
188
+ class JobLogger(Logger):
189
+ def __init__(
190
+ self,
191
+ *,
192
+ base_span: Span,
193
+ profile_metadata: job_definition_t.ProfileMetadata,
194
+ job_definition: job_definition_t.JobDefinition,
195
+ ) -> None:
196
+ self.profile_metadata = profile_metadata
197
+ self.job_definition = job_definition
198
+ super().__init__(base_span)
199
+
200
+ def _patch_attributes(
201
+ self,
202
+ attributes: Attributes | None,
203
+ *,
204
+ message: str | None = None,
205
+ severity: LogSeverity | None = None,
206
+ ) -> Attributes:
207
+ patched_attributes: dict[str, base_t.JsonValue] = {
208
+ **super()._patch_attributes(
209
+ attributes=attributes, message=message, severity=severity
210
+ )
211
+ }
212
+ patched_attributes["profile.name"] = self.profile_metadata.name
213
+ patched_attributes["profile.base_url"] = self.profile_metadata.base_url
214
+ patched_attributes["job.name"] = self.job_definition.name
215
+ patched_attributes["job.id"] = self.job_definition.id
216
+ patched_attributes["job.definition_type"] = self.job_definition.type
217
+ match self.job_definition:
218
+ case job_definition_t.CronJobDefinition():
219
+ patched_attributes["job.definition.cron_spec"] = (
220
+ self.job_definition.cron_spec
221
+ )
222
+ case job_definition_t.HttpJobDefinitionBase():
223
+ pass
224
+ case _:
225
+ assert_never(self.job_definition)
226
+ patched_attributes["job.definition.executor.type"] = (
227
+ self.job_definition.executor.type
228
+ )
229
+ match self.job_definition.executor:
230
+ case job_definition_t.JobExecutorScript():
231
+ patched_attributes["job.definition.executor.import_path"] = (
232
+ self.job_definition.executor.import_path
233
+ )
234
+ case job_definition_t.JobExecutorGenericUpload():
235
+ patched_attributes["job.definition.executor.data_source.type"] = (
236
+ self.job_definition.executor.data_source.type
237
+ )
238
+ case _:
239
+ assert_never(self.job_definition.executor)
240
+ return _cast_attributes(patched_attributes)
241
+
242
+
243
+ @contextmanager
244
+ def push_scope_optional(
245
+ logger: Logger | None, scope_name: str, *, attributes: Attributes | None = None
246
+ ) -> Generator[None, None, None]:
247
+ if logger is None:
248
+ yield
249
+ else:
250
+ with logger.push_scope(scope_name, attributes=attributes):
251
+ yield
@@ -0,0 +1,97 @@
1
+ import base64
2
+
3
+ import flask
4
+ from flask.typing import ResponseReturnValue
5
+ from opentelemetry.trace import get_current_span
6
+ from uncountable.core.environment import (
7
+ get_http_server_port,
8
+ get_server_env,
9
+ )
10
+ from uncountable.integration.executors.script_executor import resolve_script_executor
11
+ from uncountable.integration.http_server import GenericHttpRequest, HttpException
12
+ from uncountable.integration.job import CustomHttpJob, WebhookJob
13
+ from uncountable.integration.scan_profiles import load_profiles
14
+ from uncountable.integration.telemetry import Logger
15
+ from uncountable.types import job_definition_t
16
+
17
+ app = flask.Flask(__name__)
18
+
19
+
20
+ def register_route(
21
+ *,
22
+ server_logger: Logger,
23
+ profile_meta: job_definition_t.ProfileMetadata,
24
+ job: job_definition_t.HttpJobDefinitionBase,
25
+ ) -> None:
26
+ route = f"/{profile_meta.name}/{job.id}"
27
+
28
+ def handle_request() -> ResponseReturnValue:
29
+ with server_logger.push_scope(route):
30
+ try:
31
+ if not isinstance(job.executor, job_definition_t.JobExecutorScript):
32
+ raise HttpException.configuration_error(
33
+ message="[internal] http job must use a script executor"
34
+ )
35
+ job_instance = resolve_script_executor(
36
+ executor=job.executor, profile_metadata=profile_meta
37
+ )
38
+ if not isinstance(job_instance, (CustomHttpJob, WebhookJob)):
39
+ raise HttpException.configuration_error(
40
+ message="[internal] http job must descend from CustomHttpJob"
41
+ )
42
+ http_request = GenericHttpRequest(
43
+ body_base64=base64.b64encode(flask.request.get_data()).decode(),
44
+ headers=dict(flask.request.headers),
45
+ )
46
+ job_instance.validate_request(
47
+ request=http_request, job_definition=job, profile_meta=profile_meta
48
+ )
49
+ http_response = job_instance.handle_request(
50
+ request=http_request, job_definition=job, profile_meta=profile_meta
51
+ )
52
+
53
+ return flask.make_response(
54
+ http_response.response,
55
+ http_response.status_code,
56
+ http_response.headers,
57
+ )
58
+ except HttpException as e:
59
+ server_logger.log_exception(e)
60
+ return e.make_error_response()
61
+ except Exception as e:
62
+ server_logger.log_exception(e)
63
+ return HttpException.unknown_error().make_error_response()
64
+
65
+ app.add_url_rule(
66
+ route,
67
+ endpoint=f"handle_request_{job.id}",
68
+ view_func=handle_request,
69
+ methods=["POST"],
70
+ )
71
+
72
+ server_logger.log_info(f"job {job.id} webhook registered at: {route}")
73
+
74
+
75
+ def main() -> None:
76
+ app.add_url_rule("/health", "health", lambda: ("OK", 200))
77
+
78
+ profiles = load_profiles()
79
+ for profile_metadata in profiles:
80
+ server_logger = Logger(get_current_span())
81
+ for job in profile_metadata.jobs:
82
+ if isinstance(job, job_definition_t.HttpJobDefinitionBase):
83
+ register_route(
84
+ server_logger=server_logger, profile_meta=profile_metadata, job=job
85
+ )
86
+
87
+
88
+ main()
89
+
90
+
91
+ if __name__ == "__main__":
92
+ app.run(
93
+ host="0.0.0.0",
94
+ port=get_http_server_port(),
95
+ debug=get_server_env() == "playground",
96
+ exclude_patterns=[],
97
+ )
@@ -1,31 +1,50 @@
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
5
+ from .api.notebooks import add_notebook_content as add_notebook_content_t
6
+ from .api.recipes import add_recipe_to_project as add_recipe_to_project_t
7
+ from .api.recipes import add_time_series_data as add_time_series_data_t
6
8
  from .api.recipes import archive_recipes as archive_recipes_t
9
+ from .api.equipment import associate_equipment_input as associate_equipment_input_t
7
10
  from .api.recipes import associate_recipe_as_input as associate_recipe_as_input_t
8
11
  from .api.recipes import associate_recipe_as_lot as associate_recipe_as_lot_t
9
- from . import async_batch as async_batch_t
10
- from . import base as base_t
11
- from . import calculations as calculations_t
12
- from . import chemical_structure as chemical_structure_t
12
+ from . import async_batch_t as async_batch_t
13
+ from . import async_jobs_t as async_jobs_t
14
+ from . import auth_retrieval_t as auth_retrieval_t
15
+ from . import base_t as base_t
16
+ from . import calculations_t as calculations_t
17
+ from . import chemical_structure_t as chemical_structure_t
18
+ from .api.recipes import clear_recipe_outputs as clear_recipe_outputs_t
19
+ from . import client_config_t as client_config_t
20
+ from .api.uploader import complete_async_parse as complete_async_parse_t
21
+ from .api.runsheet import complete_async_upload as complete_async_upload_t
13
22
  from .api.chemical import convert_chemical_formats as convert_chemical_formats_t
14
23
  from .api.entity import create_entities as create_entities_t
15
24
  from .api.entity import create_entity as create_entity_t
16
25
  from .api.inputs import create_inputs as create_inputs_t
26
+ from .api.recipes import create_mix_order as create_mix_order_t
27
+ from .api.entity import create_or_update_entity as create_or_update_entity_t
17
28
  from .api.recipes import create_recipe as create_recipe_t
18
29
  from .api.recipe_links import create_recipe_link as create_recipe_link_t
19
30
  from .api.recipes import create_recipes as create_recipes_t
20
- from . import curves as curves_t
31
+ from . import curves_t as curves_t
32
+ from . import data_t as data_t
21
33
  from .api.recipes import disassociate_recipe_as_input as disassociate_recipe_as_input_t
34
+ from .api.files import download_file as download_file_t
22
35
  from .api.recipes import edit_recipe_inputs as edit_recipe_inputs_t
23
- from . import entity as entity_t
36
+ from . import entity_t as entity_t
24
37
  from .api.batch import execute_batch as execute_batch_t
25
38
  from .api.batch import execute_batch_load_async as execute_batch_load_async_t
26
- from . import experiment_groups as experiment_groups_t
27
- from . import field_values as field_values_t
28
- from . import fields as fields_t
39
+ from . import experiment_groups_t as experiment_groups_t
40
+ from .api.entity import export_entities as export_entities_t
41
+ from . import exports_t as exports_t
42
+ from .api.listing import fetch_listing as fetch_listing_t
43
+ from . import field_values_t as field_values_t
44
+ from . import fields_t as fields_t
45
+ from . import generic_upload_t as generic_upload_t
46
+ from .api.recipes import get_column_calculation_values as get_column_calculation_values_t
47
+ from .api.user import get_current_user_info as get_current_user_info_t
29
48
  from .api.recipes import get_curve as get_curve_t
30
49
  from .api.entity import get_entities_data as get_entities_data_t
31
50
  from .api.inputs import get_input_data as get_input_data_t
@@ -34,6 +53,7 @@ from .api.inputs import get_input_names as get_input_names_t
34
53
  from .api.inputs import get_inputs_data as get_inputs_data_t
35
54
  from .api.outputs import get_output_data as get_output_data_t
36
55
  from .api.outputs import get_output_names as get_output_names_t
56
+ from .api.outputs import get_output_organization as get_output_organization_t
37
57
  from .api.project import get_projects as get_projects_t
38
58
  from .api.project import get_projects_data as get_projects_data_t
39
59
  from .api.recipes import get_recipe_calculations as get_recipe_calculations_t
@@ -42,65 +62,124 @@ from .api.recipe_metadata import get_recipe_metadata_data as get_recipe_metadata
42
62
  from .api.recipes import get_recipe_names as get_recipe_names_t
43
63
  from .api.recipes import get_recipe_output_metadata as get_recipe_output_metadata_t
44
64
  from .api.recipes import get_recipes_data as get_recipes_data_t
45
- from . import id_source as id_source_t
46
- from . import identifier as identifier_t
47
- from . import input_attributes as input_attributes_t
48
- from . import inputs as inputs_t
65
+ from .api.entity import grant_entity_permissions as grant_entity_permissions_t
66
+ from . import id_source_t as id_source_t
67
+ from . import identifier_t as identifier_t
68
+ from . import input_attributes_t as input_attributes_t
69
+ from . import inputs_t as inputs_t
70
+ from . import integration_server_t as integration_server_t
71
+ from . import integration_session_t as integration_session_t
72
+ from . import integrations_t as integrations_t
73
+ from .api.uploader import invoke_uploader as invoke_uploader_t
74
+ from . import job_definition_t as job_definition_t
75
+ from .api.entity import list_aggregate as list_aggregate_t
49
76
  from .api.entity import list_entities as list_entities_t
50
77
  from .api.id_source import list_id_source as list_id_source_t
78
+ from . import listing_t as listing_t
79
+ from .api.entity import lock_entity as lock_entity_t
80
+ from .api.recipes import lock_recipes as lock_recipes_t
81
+ from .api.entity import lookup_entity as lookup_entity_t
51
82
  from .api.id_source import match_id_source as match_id_source_t
52
- from . import outputs as outputs_t
53
- from . import permissions as permissions_t
54
- from . import phases as phases_t
55
- from . import post_base as post_base_t
56
- from . import recipe_identifiers as recipe_identifiers_t
57
- from . import recipe_inputs as recipe_inputs_t
58
- from . import recipe_links as recipe_links_t
59
- from . import recipe_metadata as recipe_metadata_t
60
- from . import recipe_output_metadata as recipe_output_metadata_t
61
- from . import recipe_tags as recipe_tags_t
62
- from . import recipe_workflow_steps as recipe_workflow_steps_t
83
+ from . import notices_t as notices_t
84
+ from . import notifications_t as notifications_t
85
+ from . import outputs_t as outputs_t
86
+ from . import overrides_t as overrides_t
87
+ from . import permissions_t as permissions_t
88
+ from . import phases_t as phases_t
89
+ from . import post_base_t as post_base_t
90
+ from .api.integrations import publish_realtime_data as publish_realtime_data_t
91
+ from .api.integrations import push_notification as push_notification_t
92
+ from . import queued_job_t as queued_job_t
93
+ from . import recipe_identifiers_t as recipe_identifiers_t
94
+ from . import recipe_inputs_t as recipe_inputs_t
95
+ from . import recipe_links_t as recipe_links_t
96
+ from . import recipe_metadata_t as recipe_metadata_t
97
+ from . import recipe_output_metadata_t as recipe_output_metadata_t
98
+ from . import recipe_tags_t as recipe_tags_t
99
+ from . import recipe_workflow_steps_t as recipe_workflow_steps_t
100
+ from . import recipes_t as recipes_t
101
+ from .api.integrations import register_sockets_token as register_sockets_token_t
102
+ from .api.recipes import remove_recipe_from_project as remove_recipe_from_project_t
103
+ from .api.recipe_links import remove_recipe_link as remove_recipe_link_t
63
104
  from .api.entity import resolve_entity_ids as resolve_entity_ids_t
64
105
  from .api.outputs import resolve_output_conditions as resolve_output_conditions_t
65
- from . import response as response_t
106
+ from . import response_t as response_t
66
107
  from .api.triggers import run_trigger as run_trigger_t
108
+ from . import secret_retrieval_t as secret_retrieval_t
67
109
  from .api.permissions import set_core_permissions as set_core_permissions_t
110
+ from .api.entity import set_entity_field_values as set_entity_field_values_t
68
111
  from .api.inputs import set_input_attribute_values as set_input_attribute_values_t
112
+ from .api.inputs import set_input_category as set_input_category_t
113
+ from .api.inputs import set_input_subcategories as set_input_subcategories_t
114
+ from .api.inputs import set_intermediate_type as set_intermediate_type_t
69
115
  from .api.recipes import set_recipe_inputs as set_recipe_inputs_t
70
116
  from .api.recipes import set_recipe_metadata as set_recipe_metadata_t
117
+ from .api.recipes import set_recipe_output_annotations as set_recipe_output_annotations_t
118
+ from .api.recipes import set_recipe_output_file as set_recipe_output_file_t
71
119
  from .api.recipes import set_recipe_outputs as set_recipe_outputs_t
72
120
  from .api.recipes import set_recipe_tags as set_recipe_tags_t
121
+ from .api.recipes import set_recipe_total as set_recipe_total_t
73
122
  from .api.entity import set_values as set_values_t
123
+ from . import sockets_t as sockets_t
124
+ from . import structured_filters_t as structured_filters_t
74
125
  from .api.entity import transition_entity_phase as transition_entity_phase_t
75
- from . import units as units_t
76
- from . import users as users_t
77
- from . import workflows as workflows_t
126
+ from .api.recipes import unarchive_recipes as unarchive_recipes_t
127
+ from . import units_t as units_t
128
+ from .api.entity import unlock_entity as unlock_entity_t
129
+ from .api.recipes import unlock_recipes as unlock_recipes_t
130
+ from .api.material_families import update_entity_material_families as update_entity_material_families_t
131
+ from . import uploader_t as uploader_t
132
+ from .api.condition_parameters import upsert_condition_match as upsert_condition_match_t
133
+ from .api.field_options import upsert_field_options as upsert_field_options_t
134
+ from . import users_t as users_t
135
+ from . import webhook_job_t as webhook_job_t
136
+ from . import workflows_t as workflows_t
78
137
 
79
138
 
80
139
  __all__: list[str] = [
140
+ "add_notebook_content_t",
141
+ "add_recipe_to_project_t",
142
+ "add_time_series_data_t",
81
143
  "archive_recipes_t",
144
+ "associate_equipment_input_t",
82
145
  "associate_recipe_as_input_t",
83
146
  "associate_recipe_as_lot_t",
84
147
  "async_batch_t",
148
+ "async_jobs_t",
149
+ "auth_retrieval_t",
85
150
  "base_t",
86
151
  "calculations_t",
87
152
  "chemical_structure_t",
153
+ "clear_recipe_outputs_t",
154
+ "client_config_t",
155
+ "complete_async_parse_t",
156
+ "complete_async_upload_t",
88
157
  "convert_chemical_formats_t",
89
158
  "create_entities_t",
90
159
  "create_entity_t",
91
160
  "create_inputs_t",
161
+ "create_mix_order_t",
162
+ "create_or_update_entity_t",
92
163
  "create_recipe_t",
93
164
  "create_recipe_link_t",
94
165
  "create_recipes_t",
95
166
  "curves_t",
167
+ "data_t",
96
168
  "disassociate_recipe_as_input_t",
169
+ "download_file_t",
97
170
  "edit_recipe_inputs_t",
98
171
  "entity_t",
99
172
  "execute_batch_t",
100
173
  "execute_batch_load_async_t",
101
174
  "experiment_groups_t",
175
+ "export_entities_t",
176
+ "exports_t",
177
+ "fetch_listing_t",
102
178
  "field_values_t",
103
179
  "fields_t",
180
+ "generic_upload_t",
181
+ "get_column_calculation_values_t",
182
+ "get_current_user_info_t",
104
183
  "get_curve_t",
105
184
  "get_entities_data_t",
106
185
  "get_input_data_t",
@@ -109,6 +188,7 @@ __all__: list[str] = [
109
188
  "get_inputs_data_t",
110
189
  "get_output_data_t",
111
190
  "get_output_names_t",
191
+ "get_output_organization_t",
112
192
  "get_projects_t",
113
193
  "get_projects_data_t",
114
194
  "get_recipe_calculations_t",
@@ -117,17 +197,34 @@ __all__: list[str] = [
117
197
  "get_recipe_names_t",
118
198
  "get_recipe_output_metadata_t",
119
199
  "get_recipes_data_t",
200
+ "grant_entity_permissions_t",
120
201
  "id_source_t",
121
202
  "identifier_t",
122
203
  "input_attributes_t",
123
204
  "inputs_t",
205
+ "integration_server_t",
206
+ "integration_session_t",
207
+ "integrations_t",
208
+ "invoke_uploader_t",
209
+ "job_definition_t",
210
+ "list_aggregate_t",
124
211
  "list_entities_t",
125
212
  "list_id_source_t",
213
+ "listing_t",
214
+ "lock_entity_t",
215
+ "lock_recipes_t",
216
+ "lookup_entity_t",
126
217
  "match_id_source_t",
218
+ "notices_t",
219
+ "notifications_t",
127
220
  "outputs_t",
221
+ "overrides_t",
128
222
  "permissions_t",
129
223
  "phases_t",
130
224
  "post_base_t",
225
+ "publish_realtime_data_t",
226
+ "push_notification_t",
227
+ "queued_job_t",
131
228
  "recipe_identifiers_t",
132
229
  "recipe_inputs_t",
133
230
  "recipe_links_t",
@@ -135,19 +232,41 @@ __all__: list[str] = [
135
232
  "recipe_output_metadata_t",
136
233
  "recipe_tags_t",
137
234
  "recipe_workflow_steps_t",
235
+ "recipes_t",
236
+ "register_sockets_token_t",
237
+ "remove_recipe_from_project_t",
238
+ "remove_recipe_link_t",
138
239
  "resolve_entity_ids_t",
139
240
  "resolve_output_conditions_t",
140
241
  "response_t",
141
242
  "run_trigger_t",
243
+ "secret_retrieval_t",
142
244
  "set_core_permissions_t",
245
+ "set_entity_field_values_t",
143
246
  "set_input_attribute_values_t",
247
+ "set_input_category_t",
248
+ "set_input_subcategories_t",
249
+ "set_intermediate_type_t",
144
250
  "set_recipe_inputs_t",
145
251
  "set_recipe_metadata_t",
252
+ "set_recipe_output_annotations_t",
253
+ "set_recipe_output_file_t",
146
254
  "set_recipe_outputs_t",
147
255
  "set_recipe_tags_t",
256
+ "set_recipe_total_t",
148
257
  "set_values_t",
258
+ "sockets_t",
259
+ "structured_filters_t",
149
260
  "transition_entity_phase_t",
261
+ "unarchive_recipes_t",
150
262
  "units_t",
263
+ "unlock_entity_t",
264
+ "unlock_recipes_t",
265
+ "update_entity_material_families_t",
266
+ "uploader_t",
267
+ "upsert_condition_match_t",
268
+ "upsert_field_options_t",
151
269
  "users_t",
270
+ "webhook_job_t",
152
271
  "workflows_t",
153
272
  ]