UncountablePythonSDK 0.0.40__py3-none-any.whl → 0.0.42__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 (127) hide show
  1. {UncountablePythonSDK-0.0.40.dist-info → UncountablePythonSDK-0.0.42.dist-info}/METADATA +5 -1
  2. {UncountablePythonSDK-0.0.40.dist-info → UncountablePythonSDK-0.0.42.dist-info}/RECORD +126 -107
  3. docs/requirements.txt +3 -3
  4. examples/invoke_uploader.py +23 -0
  5. pkgs/argument_parser/argument_parser.py +2 -2
  6. pkgs/filesystem_utils/__init__.py +17 -0
  7. pkgs/filesystem_utils/_gdrive_session.py +306 -0
  8. pkgs/filesystem_utils/_local_session.py +69 -0
  9. pkgs/filesystem_utils/_sftp_session.py +147 -0
  10. pkgs/filesystem_utils/file_type_utils.py +61 -0
  11. pkgs/filesystem_utils/filesystem_session.py +39 -0
  12. pkgs/serialization/yaml.py +54 -0
  13. pkgs/type_spec/config.py +1 -13
  14. pkgs/type_spec/emit_open_api.py +7 -5
  15. pkgs/type_spec/emit_open_api_util.py +4 -2
  16. pkgs/type_spec/emit_python.py +13 -14
  17. pkgs/type_spec/load_types.py +2 -1
  18. pkgs/type_spec/value_spec/__main__.py +1 -1
  19. uncountable/core/file_upload.py +13 -3
  20. uncountable/integration/construct_client.py +1 -1
  21. uncountable/integration/cron.py +11 -6
  22. uncountable/integration/entrypoint.py +6 -7
  23. uncountable/integration/executors/executors.py +24 -0
  24. uncountable/integration/executors/generic_upload_executor.py +245 -0
  25. uncountable/integration/executors/script_executor.py +1 -1
  26. uncountable/integration/job.py +19 -2
  27. uncountable/integration/secret_retrieval/__init__.py +3 -0
  28. uncountable/integration/secret_retrieval/retrieve_secret.py +40 -0
  29. uncountable/integration/server.py +1 -1
  30. uncountable/types/__init__.py +8 -0
  31. uncountable/types/api/batch/execute_batch.py +5 -5
  32. uncountable/types/api/batch/execute_batch_load_async.py +3 -3
  33. uncountable/types/api/chemical/convert_chemical_formats.py +4 -4
  34. uncountable/types/api/entity/create_entities.py +4 -4
  35. uncountable/types/api/entity/create_entity.py +4 -4
  36. uncountable/types/api/entity/get_entities_data.py +4 -4
  37. uncountable/types/api/entity/list_entities.py +5 -5
  38. uncountable/types/api/entity/lock_entity.py +3 -3
  39. uncountable/types/api/entity/resolve_entity_ids.py +4 -4
  40. uncountable/types/api/entity/set_values.py +3 -3
  41. uncountable/types/api/entity/transition_entity_phase.py +5 -5
  42. uncountable/types/api/entity/unlock_entity.py +3 -3
  43. uncountable/types/api/equipment/associate_equipment_input.py +3 -3
  44. uncountable/types/api/field_options/upsert_field_options.py +4 -4
  45. uncountable/types/api/id_source/list_id_source.py +4 -4
  46. uncountable/types/api/id_source/match_id_source.py +4 -4
  47. uncountable/types/api/input_groups/get_input_group_names.py +4 -4
  48. uncountable/types/api/inputs/create_inputs.py +5 -5
  49. uncountable/types/api/inputs/get_input_data.py +7 -7
  50. uncountable/types/api/inputs/get_input_names.py +4 -4
  51. uncountable/types/api/inputs/get_inputs_data.py +7 -7
  52. uncountable/types/api/inputs/set_input_attribute_values.py +4 -4
  53. uncountable/types/api/inputs/set_input_category.py +3 -3
  54. uncountable/types/api/inputs/set_input_subcategories.py +3 -3
  55. uncountable/types/api/inputs/set_intermediate_type.py +3 -3
  56. uncountable/types/api/material_families/update_entity_material_families.py +3 -3
  57. uncountable/types/api/outputs/get_output_data.py +7 -7
  58. uncountable/types/api/outputs/get_output_names.py +4 -4
  59. uncountable/types/api/outputs/resolve_output_conditions.py +6 -6
  60. uncountable/types/api/permissions/set_core_permissions.py +7 -7
  61. uncountable/types/api/project/get_projects.py +4 -4
  62. uncountable/types/api/project/get_projects_data.py +4 -4
  63. uncountable/types/api/recipe_links/create_recipe_link.py +3 -3
  64. uncountable/types/api/recipe_links/remove_recipe_link.py +3 -3
  65. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +4 -4
  66. uncountable/types/api/recipes/add_recipe_to_project.py +3 -3
  67. uncountable/types/api/recipes/archive_recipes.py +3 -3
  68. uncountable/types/api/recipes/associate_recipe_as_input.py +3 -3
  69. uncountable/types/api/recipes/associate_recipe_as_lot.py +3 -3
  70. uncountable/types/api/recipes/create_recipe.py +3 -3
  71. uncountable/types/api/recipes/create_recipes.py +5 -5
  72. uncountable/types/api/recipes/disassociate_recipe_as_input.py +3 -3
  73. uncountable/types/api/recipes/edit_recipe_inputs.py +12 -12
  74. uncountable/types/api/recipes/get_curve.py +3 -3
  75. uncountable/types/api/recipes/get_recipe_calculations.py +4 -4
  76. uncountable/types/api/recipes/get_recipe_links.py +3 -3
  77. uncountable/types/api/recipes/get_recipe_names.py +4 -4
  78. uncountable/types/api/recipes/get_recipe_output_metadata.py +4 -4
  79. uncountable/types/api/recipes/get_recipes_data.py +12 -12
  80. uncountable/types/api/recipes/lock_recipes.py +4 -4
  81. uncountable/types/api/recipes/remove_recipe_from_project.py +3 -3
  82. uncountable/types/api/recipes/set_recipe_inputs.py +4 -4
  83. uncountable/types/api/recipes/set_recipe_metadata.py +3 -3
  84. uncountable/types/api/recipes/set_recipe_output_annotations.py +7 -7
  85. uncountable/types/api/recipes/set_recipe_outputs.py +5 -5
  86. uncountable/types/api/recipes/set_recipe_tags.py +7 -7
  87. uncountable/types/api/recipes/unarchive_recipes.py +3 -3
  88. uncountable/types/api/recipes/unlock_recipes.py +3 -3
  89. uncountable/types/api/triggers/run_trigger.py +3 -3
  90. uncountable/types/api/uploader/__init__.py +1 -0
  91. uncountable/types/api/uploader/invoke_uploader.py +38 -0
  92. uncountable/types/async_batch_processor.py +36 -0
  93. uncountable/types/async_batch_t.py +6 -4
  94. uncountable/types/calculations_t.py +2 -2
  95. uncountable/types/chemical_structure_t.py +2 -2
  96. uncountable/types/client_base.py +25 -2
  97. uncountable/types/curves_t.py +3 -3
  98. uncountable/types/entity_t.py +2 -2
  99. uncountable/types/experiment_groups_t.py +2 -2
  100. uncountable/types/field_values_t.py +5 -5
  101. uncountable/types/fields_t.py +2 -2
  102. uncountable/types/generic_upload.py +9 -0
  103. uncountable/types/generic_upload_t.py +41 -0
  104. uncountable/types/id_source_t.py +5 -5
  105. uncountable/types/identifier_t.py +4 -4
  106. uncountable/types/input_attributes_t.py +2 -2
  107. uncountable/types/inputs_t.py +2 -2
  108. uncountable/types/job_definition.py +26 -0
  109. uncountable/types/job_definition_t.py +203 -0
  110. uncountable/types/outputs_t.py +2 -2
  111. uncountable/types/phases_t.py +2 -2
  112. uncountable/types/recipe_identifiers_t.py +4 -4
  113. uncountable/types/recipe_links_t.py +2 -2
  114. uncountable/types/recipe_metadata_t.py +4 -4
  115. uncountable/types/recipe_output_metadata_t.py +2 -2
  116. uncountable/types/recipe_tags_t.py +2 -2
  117. uncountable/types/recipe_workflow_steps_t.py +5 -5
  118. uncountable/types/recipes_t.py +2 -2
  119. uncountable/types/response_t.py +2 -2
  120. uncountable/types/secret_retrieval.py +12 -0
  121. uncountable/types/secret_retrieval_t.py +69 -0
  122. uncountable/types/units_t.py +2 -2
  123. uncountable/types/users_t.py +2 -2
  124. uncountable/types/workflows_t.py +3 -3
  125. uncountable/integration/types.py +0 -89
  126. {UncountablePythonSDK-0.0.40.dist-info → UncountablePythonSDK-0.0.42.dist-info}/WHEEL +0 -0
  127. {UncountablePythonSDK-0.0.40.dist-info → UncountablePythonSDK-0.0.42.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,40 @@
1
+ import os
2
+
3
+ from uncountable.types.job_definition_t import ProfileMetadata
4
+ from uncountable.types.secret_retrieval_t import (
5
+ SecretRetrieval,
6
+ SecretRetrievalAWS,
7
+ SecretRetrievalEnv,
8
+ )
9
+
10
+
11
+ class SecretRetrievalError(BaseException):
12
+ def __init__(
13
+ self, secret_retrieval: SecretRetrieval, message: str | None = None
14
+ ) -> None:
15
+ self.secret_retrieval = secret_retrieval
16
+ self.message = message
17
+
18
+ def __str__(self) -> str:
19
+ append_message = ""
20
+ if self.message is not None:
21
+ append_message = f": {self.message}"
22
+ return f"{self.secret_retrieval.type} secret retrieval failed{append_message}"
23
+
24
+
25
+ def retrieve_secret(
26
+ secret_retrieval: SecretRetrieval, profile_metadata: ProfileMetadata
27
+ ) -> str:
28
+ match secret_retrieval:
29
+ case SecretRetrievalEnv():
30
+ env_name = (
31
+ f"UNC_{profile_metadata.name.upper()}_{secret_retrieval.env_key.upper()}"
32
+ )
33
+ secret = os.environ.get(env_name)
34
+ if secret is None:
35
+ raise SecretRetrievalError(
36
+ secret_retrieval, f"environment variable {env_name} missing"
37
+ )
38
+ return secret
39
+ case SecretRetrievalAWS():
40
+ raise NotImplementedError("aws secret retrieval not yet implemented")
@@ -11,7 +11,7 @@ from apscheduler.triggers.cron import CronTrigger
11
11
  from sqlalchemy.engine.base import Engine
12
12
 
13
13
  from uncountable.integration.cron import CronJobArgs, cron_job_executor
14
- from uncountable.integration.types import (
14
+ from uncountable.types.job_definition_t import (
15
15
  AuthRetrieval,
16
16
  CronJobDefinition,
17
17
  JobDefinition,
@@ -28,6 +28,7 @@ from .api.batch import execute_batch_load_async as execute_batch_load_async_t
28
28
  from . import experiment_groups_t as experiment_groups_t
29
29
  from . import field_values_t as field_values_t
30
30
  from . import fields_t as fields_t
31
+ from . import generic_upload_t as generic_upload_t
31
32
  from .api.recipes import get_curve as get_curve_t
32
33
  from .api.entity import get_entities_data as get_entities_data_t
33
34
  from .api.inputs import get_input_data as get_input_data_t
@@ -48,6 +49,8 @@ from . import id_source_t as id_source_t
48
49
  from . import identifier_t as identifier_t
49
50
  from . import input_attributes_t as input_attributes_t
50
51
  from . import inputs_t as inputs_t
52
+ from .api.uploader import invoke_uploader as invoke_uploader_t
53
+ from . import job_definition_t as job_definition_t
51
54
  from .api.entity import list_entities as list_entities_t
52
55
  from .api.id_source import list_id_source as list_id_source_t
53
56
  from .api.entity import lock_entity as lock_entity_t
@@ -71,6 +74,7 @@ from .api.entity import resolve_entity_ids as resolve_entity_ids_t
71
74
  from .api.outputs import resolve_output_conditions as resolve_output_conditions_t
72
75
  from . import response_t as response_t
73
76
  from .api.triggers import run_trigger as run_trigger_t
77
+ from . import secret_retrieval_t as secret_retrieval_t
74
78
  from .api.permissions import set_core_permissions as set_core_permissions_t
75
79
  from .api.inputs import set_input_attribute_values as set_input_attribute_values_t
76
80
  from .api.inputs import set_input_category as set_input_category_t
@@ -119,6 +123,7 @@ __all__: list[str] = [
119
123
  "experiment_groups_t",
120
124
  "field_values_t",
121
125
  "fields_t",
126
+ "generic_upload_t",
122
127
  "get_curve_t",
123
128
  "get_entities_data_t",
124
129
  "get_input_data_t",
@@ -139,6 +144,8 @@ __all__: list[str] = [
139
144
  "identifier_t",
140
145
  "input_attributes_t",
141
146
  "inputs_t",
147
+ "invoke_uploader_t",
148
+ "job_definition_t",
142
149
  "list_entities_t",
143
150
  "list_id_source_t",
144
151
  "lock_entity_t",
@@ -162,6 +169,7 @@ __all__: list[str] = [
162
169
  "resolve_output_conditions_t",
163
170
  "response_t",
164
171
  "run_trigger_t",
172
+ "secret_retrieval_t",
165
173
  "set_core_permissions_t",
166
174
  "set_input_attribute_values_t",
167
175
  "set_input_category_t",
@@ -8,7 +8,7 @@ import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
10
  from pkgs.strenum_compat import StrEnum
11
- from dataclasses import dataclass
11
+ import dataclasses
12
12
  from pkgs.serialization import serial_class
13
13
  from ... import base_t
14
14
 
@@ -43,7 +43,7 @@ class RequestMethod(StrEnum):
43
43
  @serial_class(
44
44
  unconverted_values={"data"},
45
45
  )
46
- @dataclass(kw_only=True)
46
+ @dataclasses.dataclass(kw_only=True)
47
47
  class BatchRequest:
48
48
  path: str
49
49
  method: RequestMethod
@@ -51,7 +51,7 @@ class BatchRequest:
51
51
 
52
52
 
53
53
  # DO NOT MODIFY -- This file is generated by type_spec
54
- @dataclass(kw_only=True)
54
+ @dataclasses.dataclass(kw_only=True)
55
55
  class Arguments:
56
56
  requests: list[BatchRequest]
57
57
 
@@ -60,7 +60,7 @@ class Arguments:
60
60
  @serial_class(
61
61
  unconverted_values={"response"},
62
62
  )
63
- @dataclass(kw_only=True)
63
+ @dataclasses.dataclass(kw_only=True)
64
64
  class BatchResponse:
65
65
  path: str
66
66
  method: RequestMethod
@@ -69,7 +69,7 @@ class BatchResponse:
69
69
 
70
70
 
71
71
  # DO NOT MODIFY -- This file is generated by type_spec
72
- @dataclass(kw_only=True)
72
+ @dataclasses.dataclass(kw_only=True)
73
73
  class Data:
74
74
  responses: list[BatchResponse]
75
75
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import async_batch_t
12
12
  from ... import base_t
13
13
 
@@ -23,13 +23,13 @@ ENDPOINT_PATH = "api/external/batch/execute_batch_load_async"
23
23
 
24
24
 
25
25
  # DO NOT MODIFY -- This file is generated by type_spec
26
- @dataclass(kw_only=True)
26
+ @dataclasses.dataclass(kw_only=True)
27
27
  class Arguments:
28
28
  requests: list[async_batch_t.AsyncBatchRequest]
29
29
 
30
30
 
31
31
  # DO NOT MODIFY -- This file is generated by type_spec
32
- @dataclass(kw_only=True)
32
+ @dataclasses.dataclass(kw_only=True)
33
33
  class Data:
34
34
  job_id: base_t.ObjectId
35
35
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
12
  from ... import base_t
13
13
 
@@ -25,13 +25,13 @@ ENDPOINT_PATH = "api/external/chemical/convert_chemical_formats"
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
- @dataclass(kw_only=True)
28
+ @dataclasses.dataclass(kw_only=True)
29
29
  class ChemicalStructureFile:
30
30
  struct_file: str
31
31
 
32
32
 
33
33
  # DO NOT MODIFY -- This file is generated by type_spec
34
- @dataclass(kw_only=True)
34
+ @dataclasses.dataclass(kw_only=True)
35
35
  class Arguments:
36
36
  source_chemical_structures: list[ChemicalStructureFile]
37
37
 
@@ -44,7 +44,7 @@ UncountableChemicalStructure = dict[str, base_t.JsonValue]
44
44
  @serial_class(
45
45
  unconverted_values={"chemical_structures"},
46
46
  )
47
- @dataclass(kw_only=True)
47
+ @dataclasses.dataclass(kw_only=True)
48
48
  class Data:
49
49
  chemical_structures: list[UncountableChemicalStructure]
50
50
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import base_t
12
12
  from ... import entity_t
13
13
  from ... import field_values_t
@@ -25,13 +25,13 @@ ENDPOINT_PATH = "api/external/entity/external_create_entities"
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
- @dataclass(kw_only=True)
28
+ @dataclasses.dataclass(kw_only=True)
29
29
  class EntityToCreate:
30
30
  field_values: typing.Optional[typing.Optional[list[field_values_t.FieldRefNameValue]]] = None
31
31
 
32
32
 
33
33
  # DO NOT MODIFY -- This file is generated by type_spec
34
- @dataclass(kw_only=True)
34
+ @dataclasses.dataclass(kw_only=True)
35
35
  class Arguments:
36
36
  definition_id: base_t.ObjectId
37
37
  entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK]]
@@ -39,7 +39,7 @@ class Arguments:
39
39
 
40
40
 
41
41
  # DO NOT MODIFY -- This file is generated by type_spec
42
- @dataclass(kw_only=True)
42
+ @dataclasses.dataclass(kw_only=True)
43
43
  class Data:
44
44
  entities: list[entity_t.Entity]
45
45
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
12
  from ... import base_t
13
13
  from ... import entity_t
@@ -29,7 +29,7 @@ ENDPOINT_PATH = "api/external/entity/external_create_entity"
29
29
  @serial_class(
30
30
  unconverted_values={"value"},
31
31
  )
32
- @dataclass(kw_only=True)
32
+ @dataclasses.dataclass(kw_only=True)
33
33
  class EntityFieldInitialValue:
34
34
  field_ref_name: str
35
35
  value: base_t.JsonValue
@@ -37,7 +37,7 @@ class EntityFieldInitialValue:
37
37
 
38
38
 
39
39
  # DO NOT MODIFY -- This file is generated by type_spec
40
- @dataclass(kw_only=True)
40
+ @dataclasses.dataclass(kw_only=True)
41
41
  class Arguments:
42
42
  definition_id: base_t.ObjectId
43
43
  entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK]]
@@ -45,7 +45,7 @@ class Arguments:
45
45
 
46
46
 
47
47
  # DO NOT MODIFY -- This file is generated by type_spec
48
- @dataclass(kw_only=True)
48
+ @dataclasses.dataclass(kw_only=True)
49
49
  class Data:
50
50
  entity: entity_t.Entity
51
51
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import base_t
12
12
  from ... import entity_t
13
13
  from ... import field_values_t
@@ -25,21 +25,21 @@ ENDPOINT_PATH = "api/external/entity/external_get_entities_data"
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
- @dataclass(kw_only=True)
28
+ @dataclasses.dataclass(kw_only=True)
29
29
  class Arguments:
30
30
  entity_ids: list[base_t.ObjectId]
31
31
  entity_type: entity_t.EntityType
32
32
 
33
33
 
34
34
  # DO NOT MODIFY -- This file is generated by type_spec
35
- @dataclass(kw_only=True)
35
+ @dataclasses.dataclass(kw_only=True)
36
36
  class EntityDetails:
37
37
  entity: entity_t.Entity
38
38
  field_values: list[field_values_t.FieldRefIdNameValue]
39
39
 
40
40
 
41
41
  # DO NOT MODIFY -- This file is generated by type_spec
42
- @dataclass(kw_only=True)
42
+ @dataclasses.dataclass(kw_only=True)
43
43
  class Data:
44
44
  entity_details: list[EntityDetails]
45
45
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
12
  from pkgs.serialization import OpaqueKey
13
13
  from ... import base_t
@@ -30,7 +30,7 @@ ENDPOINT_PATH = "api/external/entity/external_list_entities"
30
30
  @serial_class(
31
31
  unconverted_values={"attributes"},
32
32
  )
33
- @dataclass(kw_only=True)
33
+ @dataclasses.dataclass(kw_only=True)
34
34
  class Arguments:
35
35
  config_reference: str
36
36
  entity_type: typing.Optional[entity_t.EntityType] = None
@@ -43,21 +43,21 @@ class Arguments:
43
43
  @serial_class(
44
44
  unconverted_values={"column_values"},
45
45
  )
46
- @dataclass(kw_only=True)
46
+ @dataclasses.dataclass(kw_only=True)
47
47
  class EntityResult:
48
48
  entity: entity_t.Entity
49
49
  column_values: list[base_t.JsonValue]
50
50
 
51
51
 
52
52
  # DO NOT MODIFY -- This file is generated by type_spec
53
- @dataclass(kw_only=True)
53
+ @dataclasses.dataclass(kw_only=True)
54
54
  class ColumnAccess:
55
55
  name: str
56
56
  table_label: typing.Optional[str]
57
57
 
58
58
 
59
59
  # DO NOT MODIFY -- This file is generated by type_spec
60
- @dataclass(kw_only=True)
60
+ @dataclasses.dataclass(kw_only=True)
61
61
  class Data:
62
62
  columns: list[ColumnAccess]
63
63
  results: list[EntityResult]
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import async_batch_t
12
12
  from ... import entity_t
13
13
  from ... import identifier_t
@@ -24,7 +24,7 @@ ENDPOINT_PATH = "api/external/entity/external_lock_entity"
24
24
 
25
25
 
26
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
- @dataclass(kw_only=True)
27
+ @dataclasses.dataclass(kw_only=True)
28
28
  class Arguments:
29
29
  entity_key: identifier_t.IdentifierKey
30
30
  entity_type: entity_t.EntityType
@@ -32,7 +32,7 @@ class Arguments:
32
32
 
33
33
 
34
34
  # DO NOT MODIFY -- This file is generated by type_spec
35
- @dataclass(kw_only=True)
35
+ @dataclasses.dataclass(kw_only=True)
36
36
  class Data(async_batch_t.AsyncBatchActionReturn):
37
37
  pass
38
38
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import base_t
12
12
  from ... import entity_t
13
13
 
@@ -24,21 +24,21 @@ ENDPOINT_PATH = "api/external/entity/external_resolve_entity_ids"
24
24
 
25
25
 
26
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
- @dataclass(kw_only=True)
27
+ @dataclasses.dataclass(kw_only=True)
28
28
  class Arguments:
29
29
  entity_ids: list[typing.Union[str, base_t.ObjectId]]
30
30
  entity_type: entity_t.EntityType
31
31
 
32
32
 
33
33
  # DO NOT MODIFY -- This file is generated by type_spec
34
- @dataclass(kw_only=True)
34
+ @dataclasses.dataclass(kw_only=True)
35
35
  class EntityNames:
36
36
  id: typing.Union[str, int]
37
37
  name: str
38
38
 
39
39
 
40
40
  # DO NOT MODIFY -- This file is generated by type_spec
41
- @dataclass(kw_only=True)
41
+ @dataclasses.dataclass(kw_only=True)
42
42
  class Data:
43
43
  items: list[EntityNames]
44
44
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import entity_t
12
12
  from ... import field_values_t
13
13
  from ... import response_t
@@ -24,14 +24,14 @@ ENDPOINT_PATH = "api/external/entity/external_set_values"
24
24
 
25
25
 
26
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
- @dataclass(kw_only=True)
27
+ @dataclasses.dataclass(kw_only=True)
28
28
  class Arguments:
29
29
  entity: entity_t.Entity
30
30
  values: list[field_values_t.ArgumentValueRefName]
31
31
 
32
32
 
33
33
  # DO NOT MODIFY -- This file is generated by type_spec
34
- @dataclass(kw_only=True)
34
+ @dataclasses.dataclass(kw_only=True)
35
35
  class Data(response_t.Response):
36
36
  pass
37
37
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
12
  from ... import entity_t
13
13
  from ... import identifier_t
@@ -31,7 +31,7 @@ ENDPOINT_PATH = "api/external/entity/transition_entity_phase"
31
31
  @serial_class(
32
32
  parse_require={"type"},
33
33
  )
34
- @dataclass(kw_only=True)
34
+ @dataclasses.dataclass(kw_only=True)
35
35
  class TransitionIdentifierPhases:
36
36
  type: typing.Literal["phases"] = "phases"
37
37
  phase_from_key: identifier_t.IdentifierKey
@@ -42,7 +42,7 @@ class TransitionIdentifierPhases:
42
42
  @serial_class(
43
43
  parse_require={"type"},
44
44
  )
45
- @dataclass(kw_only=True)
45
+ @dataclasses.dataclass(kw_only=True)
46
46
  class TransitionIdentifierTransition:
47
47
  type: typing.Literal["transition"] = "transition"
48
48
  transition_key: identifier_t.IdentifierKey
@@ -53,14 +53,14 @@ TransitionIdentifier = typing.Union[TransitionIdentifierPhases, TransitionIdenti
53
53
 
54
54
 
55
55
  # DO NOT MODIFY -- This file is generated by type_spec
56
- @dataclass(kw_only=True)
56
+ @dataclasses.dataclass(kw_only=True)
57
57
  class Arguments:
58
58
  entity: entity_t.Entity
59
59
  transition: TransitionIdentifier
60
60
 
61
61
 
62
62
  # DO NOT MODIFY -- This file is generated by type_spec
63
- @dataclass(kw_only=True)
63
+ @dataclasses.dataclass(kw_only=True)
64
64
  class Data(response_t.Response):
65
65
  pass
66
66
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import async_batch_t
12
12
  from ... import entity_t
13
13
  from ... import identifier_t
@@ -24,14 +24,14 @@ ENDPOINT_PATH = "api/external/entity/external_unlock_entity"
24
24
 
25
25
 
26
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
- @dataclass(kw_only=True)
27
+ @dataclasses.dataclass(kw_only=True)
28
28
  class Arguments:
29
29
  entity_key: identifier_t.IdentifierKey
30
30
  entity_type: entity_t.EntityType
31
31
 
32
32
 
33
33
  # DO NOT MODIFY -- This file is generated by type_spec
34
- @dataclass(kw_only=True)
34
+ @dataclasses.dataclass(kw_only=True)
35
35
  class Data(async_batch_t.AsyncBatchActionReturn):
36
36
  pass
37
37
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import async_batch_t
12
12
  from ... import base_t
13
13
  from ... import identifier_t
@@ -24,14 +24,14 @@ ENDPOINT_PATH = "api/external/equipment/associate_equipment_input"
24
24
 
25
25
 
26
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
- @dataclass(kw_only=True)
27
+ @dataclasses.dataclass(kw_only=True)
28
28
  class Arguments:
29
29
  equipment_key: identifier_t.IdentifierKey
30
30
  material_family_ids: list[base_t.ObjectId]
31
31
 
32
32
 
33
33
  # DO NOT MODIFY -- This file is generated by type_spec
34
- @dataclass(kw_only=True)
34
+ @dataclasses.dataclass(kw_only=True)
35
35
  class Data(async_batch_t.AsyncBatchActionReturn):
36
36
  pass
37
37
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import identifier_t
12
12
 
13
13
  __all__: list[str] = [
@@ -23,7 +23,7 @@ ENDPOINT_PATH = "api/external/field_options/upsert_field_options"
23
23
 
24
24
 
25
25
  # DO NOT MODIFY -- This file is generated by type_spec
26
- @dataclass(kw_only=True)
26
+ @dataclasses.dataclass(kw_only=True)
27
27
  class FieldOption:
28
28
  option_id: str
29
29
  option_value: typing.Optional[str] = None
@@ -32,14 +32,14 @@ class FieldOption:
32
32
 
33
33
 
34
34
  # DO NOT MODIFY -- This file is generated by type_spec
35
- @dataclass(kw_only=True)
35
+ @dataclasses.dataclass(kw_only=True)
36
36
  class Arguments:
37
37
  option_set_key: identifier_t.IdentifierKey
38
38
  field_options: list[FieldOption]
39
39
 
40
40
 
41
41
  # DO NOT MODIFY -- This file is generated by type_spec
42
- @dataclass(kw_only=True)
42
+ @dataclasses.dataclass(kw_only=True)
43
43
  class Data:
44
44
  pass
45
45
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import base_t
12
12
  from ... import id_source_t
13
13
 
@@ -24,7 +24,7 @@ ENDPOINT_PATH = "api/external/id_source/list_id_source"
24
24
 
25
25
 
26
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
- @dataclass(kw_only=True)
27
+ @dataclasses.dataclass(kw_only=True)
28
28
  class Arguments:
29
29
  spec: id_source_t.IdSourceSpec
30
30
  search_label: str
@@ -33,14 +33,14 @@ class Arguments:
33
33
 
34
34
 
35
35
  # DO NOT MODIFY -- This file is generated by type_spec
36
- @dataclass(kw_only=True)
36
+ @dataclasses.dataclass(kw_only=True)
37
37
  class IdName:
38
38
  id: typing.Union[base_t.ObjectId, str]
39
39
  name: str
40
40
 
41
41
 
42
42
  # DO NOT MODIFY -- This file is generated by type_spec
43
- @dataclass(kw_only=True)
43
+ @dataclasses.dataclass(kw_only=True)
44
44
  class Data:
45
45
  results: list[IdName]
46
46
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import base_t
12
12
  from ... import id_source_t
13
13
 
@@ -24,21 +24,21 @@ ENDPOINT_PATH = "api/external/id_source/match_id_source"
24
24
 
25
25
 
26
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
- @dataclass(kw_only=True)
27
+ @dataclasses.dataclass(kw_only=True)
28
28
  class Arguments:
29
29
  spec: id_source_t.IdSourceSpec
30
30
  names: list[str]
31
31
 
32
32
 
33
33
  # DO NOT MODIFY -- This file is generated by type_spec
34
- @dataclass(kw_only=True)
34
+ @dataclasses.dataclass(kw_only=True)
35
35
  class Match:
36
36
  name: str
37
37
  ids: list[typing.Union[base_t.ObjectId, str]]
38
38
 
39
39
 
40
40
  # DO NOT MODIFY -- This file is generated by type_spec
41
- @dataclass(kw_only=True)
41
+ @dataclasses.dataclass(kw_only=True)
42
42
  class Data:
43
43
  results: list[Match]
44
44
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
- from dataclasses import dataclass
10
+ import dataclasses
11
11
  from ... import base_t
12
12
 
13
13
  __all__: list[str] = [
@@ -23,20 +23,20 @@ ENDPOINT_PATH = "api/external/input_groups/external_get_input_group_names"
23
23
 
24
24
 
25
25
  # DO NOT MODIFY -- This file is generated by type_spec
26
- @dataclass(kw_only=True)
26
+ @dataclasses.dataclass(kw_only=True)
27
27
  class Arguments:
28
28
  material_family_id: base_t.ObjectId
29
29
 
30
30
 
31
31
  # DO NOT MODIFY -- This file is generated by type_spec
32
- @dataclass(kw_only=True)
32
+ @dataclasses.dataclass(kw_only=True)
33
33
  class SimpleInputGroup:
34
34
  input_group_id: base_t.ObjectId
35
35
  name: str
36
36
 
37
37
 
38
38
  # DO NOT MODIFY -- This file is generated by type_spec
39
- @dataclass(kw_only=True)
39
+ @dataclasses.dataclass(kw_only=True)
40
40
  class Data:
41
41
  input_groups: list[SimpleInputGroup]
42
42
  # DO NOT MODIFY -- This file is generated by type_spec