UncountablePythonSDK 0.0.91__py3-none-any.whl → 0.0.93__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 (193) hide show
  1. {UncountablePythonSDK-0.0.91.dist-info → UncountablePythonSDK-0.0.93.dist-info}/METADATA +2 -2
  2. UncountablePythonSDK-0.0.93.dist-info/RECORD +301 -0
  3. {UncountablePythonSDK-0.0.91.dist-info → UncountablePythonSDK-0.0.93.dist-info}/WHEEL +1 -1
  4. examples/set_recipe_metadata_file.py +1 -1
  5. examples/upload_files.py +1 -2
  6. pkgs/argument_parser/__init__.py +3 -0
  7. pkgs/argument_parser/argument_parser.py +52 -23
  8. pkgs/filesystem_utils/__init__.py +1 -0
  9. pkgs/filesystem_utils/_gdrive_session.py +4 -4
  10. pkgs/filesystem_utils/_s3_session.py +2 -1
  11. pkgs/filesystem_utils/_sftp_session.py +2 -3
  12. pkgs/filesystem_utils/file_type_utils.py +10 -10
  13. pkgs/serialization/annotation.py +5 -5
  14. pkgs/serialization/missing_sentry.py +1 -1
  15. pkgs/serialization/serial_alias.py +3 -3
  16. pkgs/serialization/serial_class.py +10 -10
  17. pkgs/serialization/serial_generic.py +1 -1
  18. pkgs/serialization/serial_union.py +10 -10
  19. pkgs/serialization_util/__init__.py +2 -0
  20. pkgs/serialization_util/serialization_helpers.py +1 -4
  21. pkgs/type_spec/actions_registry/__main__.py +0 -4
  22. pkgs/type_spec/builder.py +121 -40
  23. pkgs/type_spec/config.py +10 -5
  24. pkgs/type_spec/emit_open_api.py +2 -2
  25. pkgs/type_spec/emit_open_api_util.py +1 -1
  26. pkgs/type_spec/emit_python.py +145 -63
  27. pkgs/type_spec/emit_typescript.py +57 -10
  28. pkgs/type_spec/load_types.py +1 -2
  29. pkgs/type_spec/open_api_util.py +1 -2
  30. pkgs/type_spec/parts/base.py.prepart +2 -0
  31. pkgs/type_spec/type_info/emit_type_info.py +8 -8
  32. pkgs/type_spec/util.py +5 -7
  33. pkgs/type_spec/value_spec/__main__.py +15 -5
  34. pkgs/type_spec/value_spec/emit_python.py +5 -2
  35. pkgs/type_spec/value_spec/types.py +1 -1
  36. uncountable/core/client.py +16 -15
  37. uncountable/core/file_upload.py +39 -15
  38. uncountable/integration/construct_client.py +3 -3
  39. uncountable/integration/executors/generic_upload_executor.py +1 -1
  40. uncountable/integration/job.py +2 -2
  41. uncountable/integration/queue_runner/command_server/types.py +1 -1
  42. uncountable/integration/queue_runner/worker.py +1 -1
  43. uncountable/integration/server.py +4 -4
  44. uncountable/integration/telemetry.py +11 -0
  45. uncountable/types/__init__.py +0 -1
  46. uncountable/types/api/batch/execute_batch.py +1 -2
  47. uncountable/types/api/batch/execute_batch_load_async.py +0 -1
  48. uncountable/types/api/chemical/convert_chemical_formats.py +0 -1
  49. uncountable/types/api/entity/create_entities.py +3 -4
  50. uncountable/types/api/entity/create_entity.py +4 -5
  51. uncountable/types/api/entity/get_entities_data.py +0 -1
  52. uncountable/types/api/entity/grant_entity_permissions.py +3 -4
  53. uncountable/types/api/entity/list_entities.py +5 -6
  54. uncountable/types/api/entity/lock_entity.py +1 -2
  55. uncountable/types/api/entity/resolve_entity_ids.py +2 -3
  56. uncountable/types/api/entity/set_entity_field_values.py +0 -1
  57. uncountable/types/api/entity/set_values.py +0 -1
  58. uncountable/types/api/entity/transition_entity_phase.py +1 -2
  59. uncountable/types/api/entity/unlock_entity.py +0 -1
  60. uncountable/types/api/equipment/associate_equipment_input.py +0 -1
  61. uncountable/types/api/field_options/upsert_field_options.py +3 -4
  62. uncountable/types/api/files/download_file.py +1 -2
  63. uncountable/types/api/id_source/list_id_source.py +3 -4
  64. uncountable/types/api/id_source/match_id_source.py +1 -2
  65. uncountable/types/api/input_groups/get_input_group_names.py +0 -1
  66. uncountable/types/api/inputs/create_inputs.py +4 -5
  67. uncountable/types/api/inputs/get_input_data.py +5 -6
  68. uncountable/types/api/inputs/get_input_names.py +3 -4
  69. uncountable/types/api/inputs/get_inputs_data.py +0 -1
  70. uncountable/types/api/inputs/set_input_attribute_values.py +2 -3
  71. uncountable/types/api/inputs/set_input_category.py +2 -3
  72. uncountable/types/api/inputs/set_input_subcategories.py +0 -1
  73. uncountable/types/api/inputs/set_intermediate_type.py +1 -2
  74. uncountable/types/api/material_families/update_entity_material_families.py +1 -2
  75. uncountable/types/api/outputs/get_output_data.py +6 -7
  76. uncountable/types/api/outputs/get_output_names.py +2 -3
  77. uncountable/types/api/outputs/resolve_output_conditions.py +2 -3
  78. uncountable/types/api/permissions/set_core_permissions.py +3 -4
  79. uncountable/types/api/project/get_projects.py +3 -4
  80. uncountable/types/api/project/get_projects_data.py +4 -5
  81. uncountable/types/api/recipe_links/create_recipe_link.py +1 -2
  82. uncountable/types/api/recipe_links/remove_recipe_link.py +1 -2
  83. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +3 -4
  84. uncountable/types/api/recipes/add_recipe_to_project.py +0 -1
  85. uncountable/types/api/recipes/archive_recipes.py +1 -2
  86. uncountable/types/api/recipes/associate_recipe_as_input.py +2 -3
  87. uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -1
  88. uncountable/types/api/recipes/clear_recipe_outputs.py +0 -1
  89. uncountable/types/api/recipes/create_recipe.py +6 -7
  90. uncountable/types/api/recipes/create_recipes.py +4 -5
  91. uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -1
  92. uncountable/types/api/recipes/edit_recipe_inputs.py +9 -10
  93. uncountable/types/api/recipes/get_column_calculation_values.py +1 -2
  94. uncountable/types/api/recipes/get_curve.py +2 -3
  95. uncountable/types/api/recipes/get_recipe_calculations.py +3 -4
  96. uncountable/types/api/recipes/get_recipe_links.py +1 -2
  97. uncountable/types/api/recipes/get_recipe_names.py +0 -1
  98. uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -1
  99. uncountable/types/api/recipes/get_recipes_data.py +22 -23
  100. uncountable/types/api/recipes/lock_recipes.py +3 -4
  101. uncountable/types/api/recipes/remove_recipe_from_project.py +0 -1
  102. uncountable/types/api/recipes/set_recipe_inputs.py +6 -7
  103. uncountable/types/api/recipes/set_recipe_metadata.py +0 -1
  104. uncountable/types/api/recipes/set_recipe_output_annotations.py +5 -6
  105. uncountable/types/api/recipes/set_recipe_output_file.py +2 -3
  106. uncountable/types/api/recipes/set_recipe_outputs.py +8 -9
  107. uncountable/types/api/recipes/set_recipe_tags.py +2 -3
  108. uncountable/types/api/recipes/unarchive_recipes.py +0 -1
  109. uncountable/types/api/recipes/unlock_recipes.py +2 -3
  110. uncountable/types/api/triggers/run_trigger.py +1 -2
  111. uncountable/types/api/uploader/invoke_uploader.py +2 -3
  112. uncountable/types/async_batch.py +0 -1
  113. uncountable/types/async_batch_processor.py +23 -24
  114. uncountable/types/async_batch_t.py +5 -6
  115. uncountable/types/async_jobs.py +0 -1
  116. uncountable/types/async_jobs_t.py +1 -2
  117. uncountable/types/auth_retrieval.py +0 -1
  118. uncountable/types/auth_retrieval_t.py +2 -3
  119. uncountable/types/base.py +0 -1
  120. uncountable/types/base_t.py +2 -1
  121. uncountable/types/calculations.py +0 -1
  122. uncountable/types/calculations_t.py +0 -1
  123. uncountable/types/chemical_structure.py +0 -1
  124. uncountable/types/chemical_structure_t.py +3 -4
  125. uncountable/types/client_base.py +65 -66
  126. uncountable/types/client_config.py +0 -1
  127. uncountable/types/client_config_t.py +1 -2
  128. uncountable/types/curves.py +0 -1
  129. uncountable/types/curves_t.py +4 -5
  130. uncountable/types/entity.py +0 -1
  131. uncountable/types/entity_t.py +3 -4
  132. uncountable/types/experiment_groups.py +0 -1
  133. uncountable/types/experiment_groups_t.py +0 -1
  134. uncountable/types/field_values.py +0 -1
  135. uncountable/types/field_values_t.py +6 -7
  136. uncountable/types/fields.py +0 -1
  137. uncountable/types/fields_t.py +0 -1
  138. uncountable/types/generic_upload.py +0 -1
  139. uncountable/types/generic_upload_t.py +7 -8
  140. uncountable/types/id_source.py +0 -1
  141. uncountable/types/id_source_t.py +2 -3
  142. uncountable/types/identifier.py +0 -1
  143. uncountable/types/identifier_t.py +1 -2
  144. uncountable/types/input_attributes.py +0 -1
  145. uncountable/types/input_attributes_t.py +2 -3
  146. uncountable/types/inputs.py +0 -1
  147. uncountable/types/inputs_t.py +2 -3
  148. uncountable/types/integration_server.py +0 -1
  149. uncountable/types/integration_server_t.py +2 -3
  150. uncountable/types/job_definition.py +0 -1
  151. uncountable/types/job_definition_t.py +16 -17
  152. uncountable/types/outputs.py +0 -1
  153. uncountable/types/outputs_t.py +1 -2
  154. uncountable/types/overrides.py +0 -1
  155. uncountable/types/overrides_t.py +0 -1
  156. uncountable/types/permissions.py +0 -1
  157. uncountable/types/permissions_t.py +1 -2
  158. uncountable/types/phases.py +0 -1
  159. uncountable/types/phases_t.py +0 -1
  160. uncountable/types/post_base.py +0 -1
  161. uncountable/types/post_base_t.py +1 -2
  162. uncountable/types/queued_job.py +0 -1
  163. uncountable/types/queued_job_t.py +2 -3
  164. uncountable/types/recipe_identifiers.py +0 -1
  165. uncountable/types/recipe_identifiers_t.py +3 -4
  166. uncountable/types/recipe_inputs.py +0 -1
  167. uncountable/types/recipe_inputs_t.py +1 -2
  168. uncountable/types/recipe_links.py +0 -1
  169. uncountable/types/recipe_links_t.py +2 -3
  170. uncountable/types/recipe_metadata.py +0 -1
  171. uncountable/types/recipe_metadata_t.py +6 -7
  172. uncountable/types/recipe_output_metadata.py +0 -1
  173. uncountable/types/recipe_output_metadata_t.py +0 -1
  174. uncountable/types/recipe_tags.py +0 -1
  175. uncountable/types/recipe_tags_t.py +0 -1
  176. uncountable/types/recipe_workflow_steps.py +0 -1
  177. uncountable/types/recipe_workflow_steps_t.py +2 -3
  178. uncountable/types/recipes.py +0 -1
  179. uncountable/types/recipes_t.py +0 -1
  180. uncountable/types/response.py +0 -1
  181. uncountable/types/response_t.py +0 -1
  182. uncountable/types/secret_retrieval.py +0 -1
  183. uncountable/types/secret_retrieval_t.py +3 -4
  184. uncountable/types/units.py +0 -1
  185. uncountable/types/units_t.py +0 -1
  186. uncountable/types/users.py +0 -1
  187. uncountable/types/users_t.py +0 -1
  188. uncountable/types/webhook_job.py +0 -1
  189. uncountable/types/webhook_job_t.py +0 -1
  190. uncountable/types/workflows.py +0 -1
  191. uncountable/types/workflows_t.py +1 -2
  192. UncountablePythonSDK-0.0.91.dist-info/RECORD +0 -301
  193. {UncountablePythonSDK-0.0.91.dist-info → UncountablePythonSDK-0.0.93.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -45,7 +44,7 @@ class RecipeColumnCalculationValue:
45
44
  ingredient_id: base_t.ObjectId
46
45
  recipe_step_id: base_t.ObjectId
47
46
  recipe_input_id: base_t.ObjectId
48
- calculation_quantity: typing.Optional[Decimal] = None
47
+ calculation_quantity: Decimal | None = None
49
48
 
50
49
 
51
50
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -29,8 +28,8 @@ ENDPOINT_PATH = "api/external/recipes/external_get_curve"
29
28
  )
30
29
  @dataclasses.dataclass(kw_only=True)
31
30
  class Arguments:
32
- recipe_output_id: typing.Optional[base_t.ObjectId] = None
33
- recipe_input_id: typing.Optional[base_t.ObjectId] = None
31
+ recipe_output_id: base_t.ObjectId | None = None
32
+ recipe_input_id: base_t.ObjectId | None = None
34
33
 
35
34
 
36
35
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -31,7 +30,7 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipe_calculations"
31
30
  @dataclasses.dataclass(kw_only=True)
32
31
  class Arguments:
33
32
  recipe_ids: list[base_t.ObjectId]
34
- calculation_ids: typing.Optional[list[base_t.ObjectId]] = None
33
+ calculation_ids: list[base_t.ObjectId] | None = None
35
34
 
36
35
 
37
36
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -44,8 +43,8 @@ class Arguments:
44
43
  class RecipeCalculation:
45
44
  recipe_id: base_t.ObjectId
46
45
  calculation_id: base_t.ObjectId
47
- quantity_dec: typing.Optional[Decimal] = None
48
- quantity_json: typing.Optional[base_t.JsonValue] = None
46
+ quantity_dec: Decimal | None = None
47
+ quantity_json: base_t.JsonValue | None = None
49
48
 
50
49
 
51
50
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -31,7 +30,7 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipe_links"
31
30
  class Arguments:
32
31
  recipe_ids: list[base_t.ObjectId]
33
32
  depth: int = 1
34
- link_types: typing.Optional[list[recipe_links_t.RecipeLinkType]]
33
+ link_types: list[recipe_links_t.RecipeLinkType] | None
35
34
 
36
35
 
37
36
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -43,10 +42,10 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipes_data"
43
42
  )
44
43
  @dataclasses.dataclass(kw_only=True)
45
44
  class Arguments:
46
- recipe_ids: typing.Optional[typing.Optional[list[base_t.ObjectId]]] = None
47
- project_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None
48
- offset: typing.Optional[typing.Optional[int]] = None
49
- limit: typing.Optional[typing.Optional[int]] = None
45
+ recipe_ids: list[base_t.ObjectId] | None = None
46
+ project_id: base_t.ObjectId | None = None
47
+ offset: int | None = None
48
+ limit: int | None = None
50
49
 
51
50
 
52
51
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -61,9 +60,9 @@ class RecipeOutput:
61
60
  output_id: base_t.ObjectId
62
61
  replicate_num: int
63
62
  quantity_json: base_t.JsonValue
64
- curve_id: typing.Optional[base_t.ObjectId]
65
- output_condition_id: typing.Optional[base_t.ObjectId]
66
- quantity_dec: typing.Optional[Decimal] = None
63
+ curve_id: base_t.ObjectId | None
64
+ output_condition_id: base_t.ObjectId | None
65
+ quantity_dec: Decimal | None = None
67
66
 
68
67
 
69
68
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -77,7 +76,7 @@ class ConditionParameterValue:
77
76
  condition_parameter_id: base_t.ObjectId
78
77
  condition_parameter_name: str
79
78
  quantity_json: base_t.JsonValue
80
- quantity_dec: typing.Optional[Decimal] = None
79
+ quantity_dec: Decimal | None = None
81
80
 
82
81
 
83
82
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -100,15 +99,15 @@ class SimpleOutputCondition:
100
99
  class RecipeInput:
101
100
  id: base_t.ObjectId
102
101
  input_id: base_t.ObjectId
103
- input_lot_recipe_id: typing.Optional[base_t.ObjectId]
102
+ input_lot_recipe_id: base_t.ObjectId | None
104
103
  recipe_step_id: base_t.ObjectId
105
104
  quantity_json: base_t.JsonValue
106
- curve_id: typing.Optional[base_t.ObjectId]
105
+ curve_id: base_t.ObjectId | None
107
106
  actual_quantity_json: base_t.JsonValue
108
107
  behavior: str
109
- ingredient_role_id: typing.Optional[base_t.ObjectId]
110
- quantity_dec: typing.Optional[Decimal] = None
111
- actual_quantity_dec: typing.Optional[Decimal] = None
108
+ ingredient_role_id: base_t.ObjectId | None
109
+ quantity_dec: Decimal | None = None
110
+ actual_quantity_dec: Decimal | None = None
112
111
 
113
112
 
114
113
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -117,10 +116,10 @@ class RecipeInput:
117
116
  )
118
117
  @dataclasses.dataclass(kw_only=True)
119
118
  class RecipeStep:
120
- name: typing.Optional[str]
119
+ name: str | None
121
120
  recipe_step_id: base_t.ObjectId
122
121
  recipe_step_number: int
123
- instructions: typing.Optional[str] = None
122
+ instructions: str | None = None
124
123
 
125
124
 
126
125
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -129,7 +128,7 @@ class RecipeStep:
129
128
  )
130
129
  @dataclasses.dataclass(kw_only=True)
131
130
  class RecipeStepGroup:
132
- name: typing.Optional[str]
131
+ name: str | None
133
132
  recipe_steps: list[RecipeStep]
134
133
 
135
134
 
@@ -152,11 +151,11 @@ class RecipeWorkflowStep:
152
151
  @dataclasses.dataclass(kw_only=True)
153
152
  class RecipeStepRelationship:
154
153
  step_relationship_id: base_t.ObjectId
155
- name: typing.Optional[str]
154
+ name: str | None
156
155
  source_recipe_workflow_step_id: base_t.ObjectId
157
156
  target_recipe_step_id: base_t.ObjectId
158
- quantity_dec: typing.Optional[Decimal] = None
159
- actual_quantity_dec: typing.Optional[Decimal] = None
157
+ quantity_dec: Decimal | None = None
158
+ actual_quantity_dec: Decimal | None = None
160
159
 
161
160
 
162
161
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -169,7 +168,7 @@ class Recipe:
169
168
  create_datetime: str
170
169
  last_modified_datetime: str
171
170
  name: str
172
- notes: typing.Optional[str]
171
+ notes: str | None
173
172
  workflow_id: base_t.ObjectId
174
173
  metadata: list[recipe_metadata_t.RecipeMetadata]
175
174
  inputs: list[RecipeInput]
@@ -178,8 +177,8 @@ class Recipe:
178
177
  tag_ids: list[base_t.ObjectId]
179
178
  experiment_group_ids: list[base_t.ObjectId]
180
179
  step_relationships: list[RecipeStepRelationship]
181
- creating_user_id: typing.Optional[base_t.ObjectId] = None
182
- barcode_value: typing.Optional[str] = None
180
+ creating_user_id: base_t.ObjectId | None = None
181
+ barcode_value: str | None = None
183
182
 
184
183
 
185
184
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -7,7 +6,7 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
- from pkgs.strenum_compat import StrEnum
9
+ from enum import StrEnum
11
10
  import dataclasses
12
11
  from pkgs.serialization import serial_class
13
12
  from ... import identifier_t
@@ -49,8 +48,8 @@ class Arguments:
49
48
  type: RecipeLockType = RecipeLockType.ALL
50
49
  recipes: list[identifier_t.IdentifierKey]
51
50
  globally_removable: bool
52
- lock_samples: typing.Optional[bool] = None
53
- comments: typing.Optional[str] = None
51
+ lock_samples: bool | None = None
52
+ comments: str | None = None
54
53
 
55
54
 
56
55
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -32,12 +31,12 @@ ENDPOINT_PATH = "api/external/recipes/external_set_recipe_inputs"
32
31
  class RecipeInputValue:
33
32
  recipe_id: base_t.ObjectId
34
33
  input_id: base_t.ObjectId
35
- recipe_step_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None
36
- value_numeric: typing.Optional[Decimal] = None
37
- value_str: typing.Optional[str] = None
38
- set_actual_value: typing.Optional[bool] = None
39
- lot_recipe_id: typing.Optional[base_t.ObjectId] = None
40
- remove: typing.Optional[bool] = None
34
+ recipe_step_id: base_t.ObjectId | None = None
35
+ value_numeric: Decimal | None = None
36
+ value_str: str | None = None
37
+ set_actual_value: bool | None = None
38
+ lot_recipe_id: base_t.ObjectId | None = None
39
+ remove: bool | None = None
41
40
 
42
41
 
43
42
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -7,7 +6,7 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
- from pkgs.strenum_compat import StrEnum
9
+ from enum import StrEnum
11
10
  import dataclasses
12
11
  from pkgs.serialization import serial_class
13
12
  from pkgs.serialization import serial_union_annotation
@@ -39,8 +38,8 @@ ENDPOINT_PATH = "api/external/recipes/set_recipe_output_annotations"
39
38
  @dataclasses.dataclass(kw_only=True)
40
39
  class AnnotationEdit:
41
40
  annotation_type_key: identifier_t.IdentifierKey
42
- lower_value: typing.Optional[Decimal] = None
43
- upper_value: typing.Optional[Decimal] = None
41
+ lower_value: Decimal | None = None
42
+ upper_value: Decimal | None = None
44
43
 
45
44
 
46
45
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -59,7 +58,7 @@ class RecipeOutputEditBase:
59
58
  output_id: base_t.ObjectId
60
59
  experiment_num: int
61
60
  annotations: list[AnnotationEdit]
62
- condition_id: typing.Optional[base_t.ObjectId] = None
61
+ condition_id: base_t.ObjectId | None = None
63
62
 
64
63
 
65
64
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -84,7 +83,7 @@ class RecipeOutputReplaceAnnotations(RecipeOutputEditBase):
84
83
 
85
84
  # DO NOT MODIFY -- This file is generated by type_spec
86
85
  RecipeOutputUpdateAnnotations = typing.Annotated[
87
- typing.Union[RecipeOutputMergeAnnotations, RecipeOutputReplaceAnnotations],
86
+ RecipeOutputMergeAnnotations | RecipeOutputReplaceAnnotations,
88
87
  serial_union_annotation(
89
88
  named_type_path="sdk.api.recipes.set_recipe_output_annotations.RecipeOutputUpdateAnnotations",
90
89
  discriminator="type",
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -33,8 +32,8 @@ class RecipeOutputFileValue:
33
32
  recipe_id: base_t.ObjectId
34
33
  output_id: base_t.ObjectId
35
34
  experiment_num: int
36
- condition_id: typing.Optional[base_t.ObjectId] = None
37
- file_id: typing.Optional[base_t.ObjectId] = None
35
+ condition_id: base_t.ObjectId | None = None
36
+ file_id: base_t.ObjectId | None = None
38
37
 
39
38
 
40
39
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -33,8 +32,8 @@ ENDPOINT_PATH = "api/external/recipes/external_set_recipe_outputs"
33
32
  )
34
33
  @dataclasses.dataclass(kw_only=True)
35
34
  class CurveValues:
36
- x_values: list[typing.Optional[Decimal]]
37
- y_values: list[typing.Optional[Decimal]]
35
+ x_values: list[Decimal | None]
36
+ y_values: list[Decimal | None]
38
37
 
39
38
 
40
39
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -47,12 +46,12 @@ class RecipeOutputValue:
47
46
  recipe_id: base_t.ObjectId
48
47
  output_id: base_t.ObjectId
49
48
  experiment_num: int
50
- condition_id: typing.Optional[base_t.ObjectId] = None
51
- value_numeric: typing.Optional[Decimal] = None
52
- value_str: typing.Optional[str] = None
53
- value_curve: typing.Optional[CurveValues] = None
54
- formatting: typing.Optional[recipes_t.RecipeAttributeFormatting] = None
55
- field_values: typing.Optional[list[typing.Union[field_values_t.ArgumentValueRefName, field_values_t.ArgumentValueId]]] = None
49
+ condition_id: base_t.ObjectId | None = None
50
+ value_numeric: Decimal | None = None
51
+ value_str: str | None = None
52
+ value_curve: CurveValues | None = None
53
+ formatting: recipes_t.RecipeAttributeFormatting | None = None
54
+ field_values: list[field_values_t.ArgumentValueRefName | field_values_t.ArgumentValueId] | None = None
56
55
 
57
56
 
58
57
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -7,7 +6,7 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
- from pkgs.strenum_compat import StrEnum
9
+ from enum import StrEnum
11
10
  import dataclasses
12
11
  from pkgs.serialization import serial_class
13
12
  from pkgs.serialization import serial_alias_annotation
@@ -82,7 +81,7 @@ class RecipeTagOverride(RecipeTagUpdateBase):
82
81
 
83
82
  # DO NOT MODIFY -- This file is generated by type_spec
84
83
  RecipeTagUpdate = typing.Annotated[
85
- typing.Union[RecipeTagAppend, RecipeTagRemove, RecipeTagOverride],
84
+ RecipeTagAppend | RecipeTagRemove | RecipeTagOverride,
86
85
  serial_alias_annotation(
87
86
  named_type_path="sdk.api.recipes.set_recipe_tags.RecipeTagUpdate",
88
87
  ),
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -7,7 +6,7 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
- from pkgs.strenum_compat import StrEnum
9
+ from enum import StrEnum
11
10
  import dataclasses
12
11
  from pkgs.serialization import serial_class
13
12
  from ... import identifier_t
@@ -37,7 +36,7 @@ class RecipeUnlockType(StrEnum):
37
36
  class Arguments:
38
37
  type: RecipeUnlockType = RecipeUnlockType.STANDARD
39
38
  recipes: list[identifier_t.IdentifierKey]
40
- unlock_samples: typing.Optional[bool] = None
39
+ unlock_samples: bool | None = None
41
40
 
42
41
 
43
42
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -30,7 +29,7 @@ ENDPOINT_PATH = "api/external/triggers/run_trigger"
30
29
  @dataclasses.dataclass(kw_only=True)
31
30
  class Arguments:
32
31
  trigger_ref_name: str
33
- entity: typing.Optional[entity_t.Entity] = None
32
+ entity: entity_t.Entity | None = None
34
33
 
35
34
 
36
35
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -33,8 +32,8 @@ ENDPOINT_PATH = "api/external/uploader/invoke_uploader"
33
32
  class Arguments:
34
33
  uploader_key: identifier_t.IdentifierKey
35
34
  destination: generic_upload_t.UploadDestination
36
- file_id: typing.Optional[base_t.ObjectId] = None
37
- file_ids: typing.Optional[list[base_t.ObjectId]] = None
35
+ file_id: base_t.ObjectId | None = None
36
+ file_ids: list[base_t.ObjectId] | None = None
38
37
 
39
38
 
40
39
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,4 +1,3 @@
1
- # flake8: noqa: F821
2
1
  # ruff: noqa: E402 Q003
3
2
  # fmt: off
4
3
  # isort: skip_file
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -28,7 +27,7 @@ import uncountable.types.api.entity.set_entity_field_values as set_entity_field_
28
27
  import uncountable.types.api.recipes.set_recipe_metadata as set_recipe_metadata_t
29
28
  import uuid
30
29
  from abc import ABC, abstractmethod
31
- from pkgs.serialization_util.serialization_helpers import serialize_for_api
30
+ from pkgs.serialization_util import serialize_for_api
32
31
 
33
32
 
34
33
  class AsyncBatchProcessorBase(ABC):
@@ -45,7 +44,7 @@ class AsyncBatchProcessorBase(ABC):
45
44
  *,
46
45
  equipment_key: identifier_t.IdentifierKey,
47
46
  material_family_ids: list[base_t.ObjectId],
48
- depends_on: typing.Optional[list[str]] = None,
47
+ depends_on: list[str] | None = None,
49
48
  ) -> async_batch_t.QueuedAsyncBatchRequest:
50
49
  """Create or return the input association for equipment
51
50
 
@@ -79,9 +78,9 @@ class AsyncBatchProcessorBase(ABC):
79
78
  self,
80
79
  *,
81
80
  recipe_key: identifier_t.IdentifierKey,
82
- input_key: typing.Optional[identifier_t.IdentifierKey] = None,
83
- show_in_listings: typing.Optional[bool] = None,
84
- depends_on: typing.Optional[list[str]] = None,
81
+ input_key: identifier_t.IdentifierKey | None = None,
82
+ show_in_listings: bool | None = None,
83
+ depends_on: list[str] | None = None,
85
84
  ) -> async_batch_t.QueuedAsyncBatchRequest:
86
85
  """Create or return the input association for a recipe
87
86
 
@@ -117,7 +116,7 @@ class AsyncBatchProcessorBase(ABC):
117
116
  self,
118
117
  *,
119
118
  recipe_key: identifier_t.IdentifierKey,
120
- depends_on: typing.Optional[list[str]] = None,
119
+ depends_on: list[str] | None = None,
121
120
  ) -> async_batch_t.QueuedAsyncBatchRequest:
122
121
  """Clears all output values & output metadata for a given recipe
123
122
 
@@ -150,13 +149,13 @@ class AsyncBatchProcessorBase(ABC):
150
149
  *,
151
150
  material_family_id: base_t.ObjectId,
152
151
  workflow_id: base_t.ObjectId,
153
- name: typing.Optional[str] = None,
154
- project_id: typing.Optional[base_t.ObjectId] = None,
155
- workflow_variant_id: typing.Optional[typing.Optional[base_t.ObjectId]] = None,
156
- recipe_metadata: typing.Optional[list[recipe_metadata_t.MetadataValue]] = None,
157
- identifiers: typing.Optional[recipe_identifiers_t.RecipeIdentifiers] = None,
158
- definition_key: typing.Optional[identifier_t.IdentifierKey] = None,
159
- depends_on: typing.Optional[list[str]] = None,
152
+ name: str | None = None,
153
+ project_id: base_t.ObjectId | None = None,
154
+ workflow_variant_id: base_t.ObjectId | None = None,
155
+ recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None,
156
+ identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None,
157
+ definition_key: identifier_t.IdentifierKey | None = None,
158
+ depends_on: list[str] | None = None,
160
159
  ) -> async_batch_t.QueuedAsyncBatchRequest:
161
160
  """Returns the id of the recipe being created.
162
161
 
@@ -204,7 +203,7 @@ class AsyncBatchProcessorBase(ABC):
204
203
  recipe_key: identifier_t.IdentifierKey,
205
204
  recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier,
206
205
  edits: list[edit_recipe_inputs_t.RecipeInputEdit],
207
- depends_on: typing.Optional[list[str]] = None,
206
+ depends_on: list[str] | None = None,
208
207
  ) -> async_batch_t.QueuedAsyncBatchRequest:
209
208
  """Clear, update, or add inputs on a recipe
210
209
 
@@ -240,10 +239,10 @@ class AsyncBatchProcessorBase(ABC):
240
239
  entity_type: entity_t.LimitedEntityType,
241
240
  entity_key: identifier_t.IdentifierKey,
242
241
  permission_types: list[entity_t.GrantableEntityPermissionType],
243
- user_keys: typing.Optional[list[identifier_t.IdentifierKey]] = None,
244
- user_group_keys: typing.Optional[list[identifier_t.IdentifierKey]] = None,
245
- all_users: typing.Optional[bool] = None,
246
- depends_on: typing.Optional[list[str]] = None,
242
+ user_keys: list[identifier_t.IdentifierKey] | None = None,
243
+ user_group_keys: list[identifier_t.IdentifierKey] | None = None,
244
+ all_users: bool | None = None,
245
+ depends_on: list[str] | None = None,
247
246
  ) -> async_batch_t.QueuedAsyncBatchRequest:
248
247
  """Grant entity permissions to a list of users or user groups or to all users.
249
248
 
@@ -280,9 +279,9 @@ class AsyncBatchProcessorBase(ABC):
280
279
  *,
281
280
  uploader_key: identifier_t.IdentifierKey,
282
281
  destination: generic_upload_t.UploadDestination,
283
- file_id: typing.Optional[base_t.ObjectId] = None,
284
- file_ids: typing.Optional[list[base_t.ObjectId]] = None,
285
- depends_on: typing.Optional[list[str]] = None,
282
+ file_id: base_t.ObjectId | None = None,
283
+ file_ids: list[base_t.ObjectId] | None = None,
284
+ depends_on: list[str] | None = None,
286
285
  ) -> async_batch_t.QueuedAsyncBatchRequest:
287
286
  """Runs a file through an uploader.
288
287
 
@@ -318,7 +317,7 @@ class AsyncBatchProcessorBase(ABC):
318
317
  *,
319
318
  entity_identifier: entity_t.EntityIdentifier,
320
319
  field_values: list[field_values_t.FieldArgumentValue],
321
- depends_on: typing.Optional[list[str]] = None,
320
+ depends_on: list[str] | None = None,
322
321
  ) -> async_batch_t.QueuedAsyncBatchRequest:
323
322
  """Sets field values for an entity
324
323
 
@@ -353,7 +352,7 @@ class AsyncBatchProcessorBase(ABC):
353
352
  *,
354
353
  recipe_key: identifier_t.IdentifierKey,
355
354
  recipe_metadata: list[recipe_metadata_t.MetadataValue],
356
- depends_on: typing.Optional[list[str]] = None,
355
+ depends_on: list[str] | None = None,
357
356
  ) -> async_batch_t.QueuedAsyncBatchRequest:
358
357
  """Set metadata values on a recipe
359
358
 
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -7,7 +6,7 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
- from pkgs.strenum_compat import StrEnum
9
+ from enum import StrEnum
11
10
  import dataclasses
12
11
  from pkgs.serialization import serial_class
13
12
  from . import base_t
@@ -50,7 +49,7 @@ class AsyncBatchRequest:
50
49
  path: AsyncBatchRequestPath
51
50
  data: base_t.JsonValue
52
51
  batch_reference: str
53
- depends_on: typing.Optional[list[str]] = None
52
+ depends_on: list[str] | None = None
54
53
 
55
54
 
56
55
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -71,9 +70,9 @@ class AsyncBatchResultValue:
71
70
  @dataclasses.dataclass(kw_only=True)
72
71
  class AsyncBatchActionReturn:
73
72
  modification_made: bool
74
- result_id: typing.Optional[base_t.ObjectId] = None
75
- entity: typing.Optional[entity_t.Entity] = None
76
- result_values: typing.Optional[list[AsyncBatchResultValue]] = None
73
+ result_id: base_t.ObjectId | None = None
74
+ entity: entity_t.Entity | None = None
75
+ result_values: list[AsyncBatchResultValue] | None = None
77
76
 
78
77
 
79
78
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,4 +1,3 @@
1
- # flake8: noqa: F821
2
1
  # ruff: noqa: E402 Q003
3
2
  # fmt: off
4
3
  # isort: skip_file
@@ -1,5 +1,4 @@
1
1
  # DO NOT MODIFY -- This file is generated by type_spec
2
- # flake8: noqa: F821
3
2
  # ruff: noqa: E402 Q003
4
3
  # fmt: off
5
4
  # isort: skip_file
@@ -7,7 +6,7 @@ from __future__ import annotations
7
6
  import typing # noqa: F401
8
7
  import datetime # noqa: F401
9
8
  from decimal import Decimal # noqa: F401
10
- from pkgs.strenum_compat import StrEnum
9
+ from enum import StrEnum
11
10
  from pkgs.serialization import serial_string_enum
12
11
 
13
12
  __all__: list[str] = [
@@ -1,4 +1,3 @@
1
- # flake8: noqa: F821
2
1
  # ruff: noqa: E402 Q003
3
2
  # fmt: off
4
3
  # isort: skip_file