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,108 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from . import base_t
13
+ from . import entity_t
14
+
15
+ __all__: list[str] = [
16
+ "AsyncBatchActionReturn",
17
+ "AsyncBatchRequest",
18
+ "AsyncBatchRequestPath",
19
+ "AsyncBatchResultValue",
20
+ "QueuedAsyncBatchRequest",
21
+ "SavedAsyncBatchActionReturn",
22
+ ]
23
+
24
+
25
+ # DO NOT MODIFY -- This file is generated by type_spec
26
+ class AsyncBatchRequestPath(StrEnum):
27
+ CREATE_RECIPE = "recipes/create_recipe"
28
+ SET_RECIPE_METADATA = "recipes/set_recipe_metadata"
29
+ SET_RECIPE_TAGS = "recipes/set_recipe_tags"
30
+ EDIT_RECIPE_INPUTS = "recipes/edit_recipe_inputs"
31
+ ARCHIVE_RECIPES = "recipes/archive"
32
+ LOCK_RECIPES = "recipes/lock_recipes"
33
+ UNLOCK_RECIPES = "recipes/unlock_recipes"
34
+ ASSOCIATE_EQUIPMENT_INPUT = "equipment/associate_equipment_input"
35
+ INVOKE_UPLOADER = "uploader/invoke_uploader"
36
+ ASSOCIATE_RECIPE_AS_INPUT = "recipes/associate_recipe_as_input"
37
+ CLEAR_RECIPE_OUTPUTS = "recipes/clear_recipe_outputs"
38
+ GRANT_ENTITY_PERMISSIONS = "entity/grant_entity_permissions"
39
+ SET_ENTITY_FIELD_VALUES = "entity/set_entity_field_values"
40
+ ASSOCIATE_RECIPE_AS_LOT = "recipes/associate_recipe_as_lot"
41
+ CREATE_OR_UPDATE_ENTITY = "entity/create_or_update_entity"
42
+ ADD_TIME_SERIES_DATA = "recipes/add_time_series_data"
43
+ LOOKUP_ENTITY = "entity/lookup_entity"
44
+ CREATE_RECIPE_LINK = "recipe_links/create_recipe_link"
45
+ UPSERT_CONDITION_MATCH = "condition_parameters/upsert_condition_match"
46
+ COMPLETE_ASYNC_UPLOAD = "runsheet/complete_async_upload"
47
+ CREATE_MIX_ORDER = "recipes/create_mix_order"
48
+ PUSH_NOTIFICATION = "integrations/push_notification"
49
+ COMPLETE_ASYNC_PARSE = "uploader/complete_async_parse"
50
+ SET_RECIPE_TOTAL = "recipes/set_recipe_total"
51
+ TRANSITION_ENTITY_PHASE = "entity/transition_entity_phase"
52
+
53
+
54
+ # DO NOT MODIFY -- This file is generated by type_spec
55
+ @serial_class(
56
+ named_type_path="sdk.async_batch.AsyncBatchRequest",
57
+ unconverted_values={"data"},
58
+ )
59
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
60
+ class AsyncBatchRequest:
61
+ path: AsyncBatchRequestPath
62
+ data: base_t.JsonValue
63
+ batch_reference: str
64
+ depends_on: list[str] | None = None
65
+
66
+
67
+ # DO NOT MODIFY -- This file is generated by type_spec
68
+ @serial_class(
69
+ named_type_path="sdk.async_batch.AsyncBatchResultValue",
70
+ unconverted_values={"value"},
71
+ )
72
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
73
+ class AsyncBatchResultValue:
74
+ data_key: str
75
+ value: base_t.JsonValue
76
+
77
+
78
+ # DO NOT MODIFY -- This file is generated by type_spec
79
+ @serial_class(
80
+ named_type_path="sdk.async_batch.AsyncBatchActionReturn",
81
+ )
82
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
83
+ class AsyncBatchActionReturn:
84
+ modification_made: bool
85
+ result_id: base_t.ObjectId | None = None
86
+ entity: entity_t.Entity | None = None
87
+ result_values: list[AsyncBatchResultValue] | None = None
88
+
89
+
90
+ # DO NOT MODIFY -- This file is generated by type_spec
91
+ @serial_class(
92
+ named_type_path="sdk.async_batch.SavedAsyncBatchActionReturn",
93
+ )
94
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
95
+ class SavedAsyncBatchActionReturn:
96
+ identifier: str
97
+ result_data: AsyncBatchActionReturn
98
+
99
+
100
+ # DO NOT MODIFY -- This file is generated by type_spec
101
+ @serial_class(
102
+ named_type_path="sdk.async_batch.QueuedAsyncBatchRequest",
103
+ )
104
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
105
+ class QueuedAsyncBatchRequest:
106
+ path: AsyncBatchRequestPath
107
+ batch_reference: str
108
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,8 @@
1
+ # ruff: noqa: E402 Q003
2
+ # fmt: off
3
+ # isort: skip_file
4
+ # DO NOT MODIFY -- This file is generated by type_spec
5
+ # Kept only for SDK backwards compatibility
6
+ from .async_jobs_t import AsyncJobType as AsyncJobType
7
+ from .async_jobs_t import AsyncJobStatus as AsyncJobStatus
8
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,52 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ from pkgs.serialization import serial_string_enum
11
+
12
+ __all__: list[str] = [
13
+ "ASYNC_JOB_STATUS_FIELD_REF_NAME",
14
+ "ASYNC_JOB_TYPE_FIELD_REF_NAME",
15
+ "AsyncJobStatus",
16
+ "AsyncJobType",
17
+ ]
18
+
19
+
20
+ # DO NOT MODIFY -- This file is generated by type_spec
21
+ @serial_string_enum(
22
+ labels={
23
+ "async_batch_load": "Async Batch Load",
24
+ "integration_server_run": "Integration Server Run",
25
+ },
26
+ )
27
+ class AsyncJobType(StrEnum):
28
+ ASYNC_BATCH_LOAD = "async_batch_load"
29
+ INTEGRATION_SERVER_RUN = "integration_server_run"
30
+
31
+
32
+ # DO NOT MODIFY -- This file is generated by type_spec
33
+ @serial_string_enum(
34
+ labels={
35
+ "in_progress": "In Progress",
36
+ "completed": "Completed",
37
+ "error": "Error",
38
+ },
39
+ )
40
+ class AsyncJobStatus(StrEnum):
41
+ IN_PROGRESS = "in_progress"
42
+ COMPLETED = "completed"
43
+ ERROR = "error"
44
+
45
+
46
+ # DO NOT MODIFY -- This file is generated by type_spec
47
+ ASYNC_JOB_TYPE_FIELD_REF_NAME = "core_async_job_jobType"
48
+
49
+
50
+ # DO NOT MODIFY -- This file is generated by type_spec
51
+ ASYNC_JOB_STATUS_FIELD_REF_NAME = "core_async_job_status"
52
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,11 @@
1
+ # ruff: noqa: E402 Q003
2
+ # fmt: off
3
+ # isort: skip_file
4
+ # DO NOT MODIFY -- This file is generated by type_spec
5
+ # Kept only for SDK backwards compatibility
6
+ from .auth_retrieval_t import AuthRetrievalType as AuthRetrievalType
7
+ from .auth_retrieval_t import AuthRetrievalBase as AuthRetrievalBase
8
+ from .auth_retrieval_t import AuthRetrievalOAuth as AuthRetrievalOAuth
9
+ from .auth_retrieval_t import AuthRetrievalBasic as AuthRetrievalBasic
10
+ from .auth_retrieval_t import AuthRetrieval as AuthRetrieval
11
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,75 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_union_annotation
13
+ from . import base_t
14
+ from . import secret_retrieval_t
15
+
16
+ __all__: list[str] = [
17
+ "AuthRetrieval",
18
+ "AuthRetrievalBase",
19
+ "AuthRetrievalBasic",
20
+ "AuthRetrievalOAuth",
21
+ "AuthRetrievalType",
22
+ ]
23
+
24
+
25
+ # DO NOT MODIFY -- This file is generated by type_spec
26
+ class AuthRetrievalType(StrEnum):
27
+ OAUTH = "oauth"
28
+ BASIC = "basic"
29
+
30
+
31
+ # DO NOT MODIFY -- This file is generated by type_spec
32
+ @serial_class(
33
+ named_type_path="sdk.auth_retrieval.AuthRetrievalBase",
34
+ )
35
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
36
+ class AuthRetrievalBase:
37
+ type: AuthRetrievalType
38
+
39
+
40
+ # DO NOT MODIFY -- This file is generated by type_spec
41
+ @serial_class(
42
+ named_type_path="sdk.auth_retrieval.AuthRetrievalOAuth",
43
+ parse_require={"type"},
44
+ )
45
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
46
+ class AuthRetrievalOAuth(AuthRetrievalBase):
47
+ type: typing.Literal[AuthRetrievalType.OAUTH] = AuthRetrievalType.OAUTH
48
+ refresh_token_secret: secret_retrieval_t.SecretRetrieval
49
+
50
+
51
+ # DO NOT MODIFY -- This file is generated by type_spec
52
+ @serial_class(
53
+ named_type_path="sdk.auth_retrieval.AuthRetrievalBasic",
54
+ parse_require={"type"},
55
+ )
56
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
57
+ class AuthRetrievalBasic(AuthRetrievalBase):
58
+ type: typing.Literal[AuthRetrievalType.BASIC] = AuthRetrievalType.BASIC
59
+ api_id_secret: secret_retrieval_t.SecretRetrieval
60
+ api_key_secret: secret_retrieval_t.SecretRetrieval
61
+
62
+
63
+ # DO NOT MODIFY -- This file is generated by type_spec
64
+ AuthRetrieval = typing.Annotated[
65
+ AuthRetrievalOAuth | AuthRetrievalBasic,
66
+ serial_union_annotation(
67
+ named_type_path="sdk.auth_retrieval.AuthRetrieval",
68
+ discriminator="type",
69
+ discriminator_map={
70
+ "oauth": AuthRetrievalOAuth,
71
+ "basic": AuthRetrievalBasic,
72
+ },
73
+ ),
74
+ ]
75
+ # DO NOT MODIFY -- This file is generated by type_spec
uncountable/types/base.py CHANGED
@@ -1,85 +1,10 @@
1
- # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
- # ruff: noqa: E402
1
+ # ruff: noqa: E402 Q003
4
2
  # fmt: off
5
3
  # isort: skip_file
6
- from __future__ import annotations
7
- import typing # noqa: F401
8
- import datetime # noqa: F401
9
- from decimal import Decimal # noqa: F401
10
-
11
- __all__: list[str] = [
12
- "JsonScalar",
13
- "JsonValue",
14
- "ObjectId",
15
- ]
16
4
  # DO NOT MODIFY -- This file is generated by type_spec
17
- # === START section from base.prepart.py ===
18
- """
19
- Types that type_spec will use in the emitted files.
20
- """
21
- from typing import Union, Any, TYPE_CHECKING
22
- from collections.abc import Mapping, Sequence
23
-
24
- # These two are part of the core output, thus don't duplicate here
25
- # from decimal import Decimal
26
- # import datetime
27
-
28
- # Decimal/datetime are included as this list includes JSON serializable objects
29
- # It is preferred to use ExtJsonScalar and leave JsonScalar as deprecated, as
30
- # a type that we intend on migrating.
31
- JsonScalar = Union[str, float, bool, Decimal, None, datetime.datetime, datetime.date]
32
- ExtJsonScalar = JsonScalar
33
-
34
- # PureJsonScalar/PureJsonValue should be used in places where the type
35
- # is expected to already serialized and not expecting any high-order types.
36
- # this type is fully representable in the JSON format, and in JavaScript
37
- PureJsonScalar = Union[str, float, bool, None]
38
-
39
- # Regular expressions for identifying ref names and IDs. Ref names should be
40
- # using this regular expression as a constriant in the database.
41
- REF_NAME_REGEX = r"^[a-zA-Z0-9_/-]+$"
42
- # Does not support nonpositive integers at the moment.
43
- ID_REGEX = r"[1-9][0-9]{0,20}"
44
-
45
-
46
- if TYPE_CHECKING:
47
- JsonValue = Union[JsonScalar, Mapping[str, "JsonValue"], Sequence["JsonValue"]]
48
- ExtJsonValue = JsonValue
49
- PureJsonValue = Union[
50
- PureJsonScalar,
51
- Mapping[str, "PureJsonValue"],
52
- Sequence["PureJsonValue"]
53
- ]
54
- else:
55
- JsonValue = Union[JsonScalar, dict[str, Any], list[Any]]
56
- ExtJsonValue = JsonValue
57
- PureJsonValue = Union[PureJsonScalar, dict[str, Any], list[Any]]
58
-
59
- ObjectId = int
60
-
61
-
62
- def is_pure_json_value(value: ExtJsonValue) -> bool:
63
- """
64
- Checks if the runtime type of value is a PureJsonValue.
65
- """
66
- if value is None:
67
- return True
68
- if isinstance(value, (int, float, bool, str)):
69
- return True
70
-
71
- if isinstance(value, list):
72
- for item in value:
73
- if not is_pure_json_value(item):
74
- return False
75
- return True
76
-
77
- if isinstance(value, dict):
78
- for key, item in value.items():
79
- if not is_pure_json_value(key) or not is_pure_json_value(item):
80
- return False
81
- return True
5
+ # Kept only for SDK backwards compatibility
82
6
 
83
- return False
84
- # === END section from base.prepart.py ===
7
+ from .base_t import JsonScalar as JsonScalar
8
+ from .base_t import JsonValue as JsonValue
9
+ from .base_t import ObjectId as ObjectId
85
10
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,87 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+
10
+ __all__: list[str] = [
11
+ "JsonScalar",
12
+ "JsonValue",
13
+ "ObjectId",
14
+ ]
15
+ # DO NOT MODIFY -- This file is generated by type_spec
16
+ # === START section from base.prepart.py ===
17
+ """
18
+ Types that type_spec will use in the emitted files.
19
+ """
20
+ from typing import Union, Any, TYPE_CHECKING
21
+ from collections.abc import Mapping, Sequence
22
+
23
+ # These two are part of the core output, thus don't duplicate here
24
+ # from decimal import Decimal
25
+ # import datetime
26
+
27
+ # Decimal/datetime are included as this list includes JSON serializable objects
28
+ # It is preferred to use ExtJsonScalar and leave JsonScalar as deprecated, as
29
+ # a type that we intend on migrating.
30
+ JsonScalar = Union[str, float, bool, Decimal, None, datetime.datetime, datetime.date]
31
+ ExtJsonScalar = JsonScalar
32
+
33
+ # PureJsonScalar/PureJsonValue should be used in places where the type
34
+ # is expected to already serialized and not expecting any high-order types.
35
+ # this type is fully representable in the JSON format, and in JavaScript
36
+ PureJsonScalar = Union[str, float, bool, None]
37
+
38
+ # Regular expressions for identifying ref names and IDs. Ref names should be
39
+ # using this regular expression as a constriant in the database.
40
+ REF_NAME_REGEX = r"^[a-zA-Z0-9_/-]+$"
41
+ REF_NAME_STRICT_REGEX_STRING = "^[a-zA-Z_][a-zA-Z0-9_]*$"
42
+ REF_NAME_STRICT_REGEX = rf"{REF_NAME_STRICT_REGEX_STRING}"
43
+ # Ids matching a strict integer number are converted to integers
44
+ ID_REGEX = r"-?[1-9][0-9]{0,20}"
45
+
46
+
47
+ # ENABLE_SLOTS should be removed after slots have been tested locally
48
+ import os
49
+ ENABLE_SLOTS = os.environ.get("UNC_ENABLE_DATACLASS_SLOTS") == "true"
50
+
51
+ if TYPE_CHECKING:
52
+ JsonValue = Union[JsonScalar, Mapping[str, "JsonValue"], Sequence["JsonValue"]]
53
+ ExtJsonValue = JsonValue
54
+ PureJsonValue = Union[
55
+ PureJsonScalar,
56
+ Mapping[str, "PureJsonValue"],
57
+ Sequence["PureJsonValue"]
58
+ ]
59
+ else:
60
+ JsonValue = Union[JsonScalar, dict[str, Any], list[Any]]
61
+ ExtJsonValue = JsonValue
62
+ PureJsonValue = Union[PureJsonScalar, dict[str, Any], list[Any]]
63
+
64
+ ObjectId = int
65
+
66
+
67
+ def is_pure_json_value(value: ExtJsonValue) -> bool:
68
+ """
69
+ Checks if the runtime type of value is a PureJsonValue.
70
+ """
71
+ if value is None:
72
+ return True
73
+ if isinstance(value, (int, float, bool, str)):
74
+ return True
75
+
76
+ if isinstance(value, list):
77
+ return all(is_pure_json_value(item) for item in value)
78
+
79
+ if isinstance(value, dict):
80
+ return all(
81
+ is_pure_json_value(key) and is_pure_json_value(item)
82
+ for key, item in value.items()
83
+ )
84
+
85
+ return False
86
+ # === END section from base.prepart.py ===
87
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,23 +1,7 @@
1
- # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
- # ruff: noqa: E402
1
+ # ruff: noqa: E402 Q003
4
2
  # fmt: off
5
3
  # isort: skip_file
6
- from __future__ import annotations
7
- import typing # noqa: F401
8
- import datetime # noqa: F401
9
- from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
11
- from . import base as base_t
12
-
13
- __all__: list[str] = [
14
- "Calculation",
15
- ]
16
-
17
-
18
4
  # DO NOT MODIFY -- This file is generated by type_spec
19
- @dataclass(kw_only=True)
20
- class Calculation:
21
- id: base_t.ObjectId
22
- name: str
5
+ # Kept only for SDK backwards compatibility
6
+ from .calculations_t import Calculation as Calculation
23
7
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,26 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from . import base_t
12
+
13
+ __all__: list[str] = [
14
+ "Calculation",
15
+ ]
16
+
17
+
18
+ # DO NOT MODIFY -- This file is generated by type_spec
19
+ @serial_class(
20
+ named_type_path="sdk.calculations.Calculation",
21
+ )
22
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
23
+ class Calculation:
24
+ id: base_t.ObjectId
25
+ name: str
26
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,27 +1,7 @@
1
- # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
- # ruff: noqa: E402
1
+ # ruff: noqa: E402 Q003
4
2
  # fmt: off
5
3
  # isort: skip_file
6
- from __future__ import annotations
7
- import typing # noqa: F401
8
- import datetime # noqa: F401
9
- from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
11
- from pkgs.serialization import serial_class
12
-
13
- __all__: list[str] = [
14
- "ChemicalStructure",
15
- ]
16
-
17
-
18
4
  # DO NOT MODIFY -- This file is generated by type_spec
19
- @serial_class(
20
- to_string_values={"molecular_weight"},
21
- )
22
- @dataclass(kw_only=True)
23
- class ChemicalStructure:
24
- ketcher_file: typing.Optional[str] = None
25
- gross_formula: typing.Optional[str] = None
26
- molecular_weight: typing.Optional[Decimal] = None
5
+ # Kept only for SDK backwards compatibility
6
+ from .chemical_structure_t import ChemicalStructure as ChemicalStructure
27
7
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,28 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from . import base_t
12
+
13
+ __all__: list[str] = [
14
+ "ChemicalStructure",
15
+ ]
16
+
17
+
18
+ # DO NOT MODIFY -- This file is generated by type_spec
19
+ @serial_class(
20
+ named_type_path="sdk.chemical_structure.ChemicalStructure",
21
+ to_string_values={"molecular_weight"},
22
+ )
23
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
24
+ class ChemicalStructure:
25
+ ketcher_file: str | None = None
26
+ gross_formula: str | None = None
27
+ molecular_weight: Decimal | None = None
28
+ # DO NOT MODIFY -- This file is generated by type_spec