UncountablePythonSDK 0.0.110__py3-none-any.whl → 0.0.112__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 (136) hide show
  1. docs/conf.py +2 -2
  2. docs/justfile +1 -1
  3. examples/create_ingredient_sdk.py +34 -0
  4. examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +35 -0
  5. examples/integration-server/jobs/materials_auto/profile.yaml +9 -0
  6. examples/integration-server/pyproject.toml +2 -2
  7. pkgs/argument_parser/argument_parser.py +9 -6
  8. pkgs/type_spec/builder.py +19 -2
  9. pkgs/type_spec/emit_python.py +9 -3
  10. pkgs/type_spec/emit_typescript_util.py +16 -1
  11. pkgs/type_spec/parts/base.py.prepart +4 -0
  12. pkgs/type_spec/type_info/emit_type_info.py +12 -3
  13. pkgs/type_spec/ui_entry_actions/__init__.py +4 -0
  14. pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +294 -0
  15. pkgs/type_spec/value_spec/convert_type.py +13 -0
  16. uncountable/core/client.py +7 -4
  17. uncountable/integration/executors/generic_upload_executor.py +3 -2
  18. uncountable/integration/job.py +24 -1
  19. uncountable/integration/queue_runner/datastore/datastore_sqlite.py +3 -2
  20. uncountable/integration/scheduler.py +4 -3
  21. uncountable/types/__init__.py +4 -0
  22. uncountable/types/api/batch/execute_batch.py +4 -4
  23. uncountable/types/api/batch/execute_batch_load_async.py +2 -2
  24. uncountable/types/api/chemical/convert_chemical_formats.py +3 -3
  25. uncountable/types/api/condition_parameters/__init__.py +1 -0
  26. uncountable/types/api/condition_parameters/upsert_condition_match.py +72 -0
  27. uncountable/types/api/entity/create_entities.py +3 -3
  28. uncountable/types/api/entity/create_entity.py +3 -3
  29. uncountable/types/api/entity/create_or_update_entity.py +3 -2
  30. uncountable/types/api/entity/get_entities_data.py +3 -3
  31. uncountable/types/api/entity/grant_entity_permissions.py +3 -2
  32. uncountable/types/api/entity/list_entities.py +4 -4
  33. uncountable/types/api/entity/lock_entity.py +3 -2
  34. uncountable/types/api/entity/lookup_entity.py +5 -5
  35. uncountable/types/api/entity/resolve_entity_ids.py +3 -3
  36. uncountable/types/api/entity/set_entity_field_values.py +3 -2
  37. uncountable/types/api/entity/set_values.py +3 -2
  38. uncountable/types/api/entity/transition_entity_phase.py +5 -4
  39. uncountable/types/api/entity/unlock_entity.py +3 -2
  40. uncountable/types/api/equipment/associate_equipment_input.py +2 -2
  41. uncountable/types/api/field_options/upsert_field_options.py +4 -3
  42. uncountable/types/api/files/download_file.py +4 -3
  43. uncountable/types/api/id_source/list_id_source.py +3 -3
  44. uncountable/types/api/id_source/match_id_source.py +3 -3
  45. uncountable/types/api/input_groups/get_input_group_names.py +3 -3
  46. uncountable/types/api/inputs/create_inputs.py +6 -4
  47. uncountable/types/api/inputs/get_input_data.py +6 -6
  48. uncountable/types/api/inputs/get_input_names.py +3 -3
  49. uncountable/types/api/inputs/get_inputs_data.py +6 -6
  50. uncountable/types/api/inputs/set_input_attribute_values.py +3 -3
  51. uncountable/types/api/inputs/set_input_category.py +3 -2
  52. uncountable/types/api/inputs/set_input_subcategories.py +3 -2
  53. uncountable/types/api/inputs/set_intermediate_type.py +3 -2
  54. uncountable/types/api/material_families/update_entity_material_families.py +2 -2
  55. uncountable/types/api/outputs/get_output_data.py +6 -6
  56. uncountable/types/api/outputs/get_output_names.py +3 -3
  57. uncountable/types/api/outputs/resolve_output_conditions.py +5 -5
  58. uncountable/types/api/permissions/set_core_permissions.py +7 -6
  59. uncountable/types/api/project/get_projects.py +3 -3
  60. uncountable/types/api/project/get_projects_data.py +3 -3
  61. uncountable/types/api/recipe_links/create_recipe_link.py +3 -2
  62. uncountable/types/api/recipe_links/remove_recipe_link.py +3 -2
  63. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +3 -3
  64. uncountable/types/api/recipes/add_recipe_to_project.py +3 -2
  65. uncountable/types/api/recipes/add_time_series_data.py +4 -3
  66. uncountable/types/api/recipes/archive_recipes.py +3 -2
  67. uncountable/types/api/recipes/associate_recipe_as_input.py +3 -2
  68. uncountable/types/api/recipes/associate_recipe_as_lot.py +3 -2
  69. uncountable/types/api/recipes/clear_recipe_outputs.py +3 -2
  70. uncountable/types/api/recipes/create_recipe.py +2 -2
  71. uncountable/types/api/recipes/create_recipes.py +4 -4
  72. uncountable/types/api/recipes/disassociate_recipe_as_input.py +3 -2
  73. uncountable/types/api/recipes/edit_recipe_inputs.py +18 -16
  74. uncountable/types/api/recipes/get_column_calculation_values.py +3 -3
  75. uncountable/types/api/recipes/get_curve.py +2 -2
  76. uncountable/types/api/recipes/get_recipe_calculations.py +3 -3
  77. uncountable/types/api/recipes/get_recipe_links.py +2 -2
  78. uncountable/types/api/recipes/get_recipe_names.py +3 -3
  79. uncountable/types/api/recipes/get_recipe_output_metadata.py +3 -3
  80. uncountable/types/api/recipes/get_recipes_data.py +11 -11
  81. uncountable/types/api/recipes/lock_recipes.py +4 -3
  82. uncountable/types/api/recipes/remove_recipe_from_project.py +3 -2
  83. uncountable/types/api/recipes/set_recipe_inputs.py +3 -3
  84. uncountable/types/api/recipes/set_recipe_metadata.py +3 -2
  85. uncountable/types/api/recipes/set_recipe_output_annotations.py +6 -6
  86. uncountable/types/api/recipes/set_recipe_output_file.py +3 -3
  87. uncountable/types/api/recipes/set_recipe_outputs.py +4 -4
  88. uncountable/types/api/recipes/set_recipe_tags.py +6 -6
  89. uncountable/types/api/recipes/unarchive_recipes.py +3 -2
  90. uncountable/types/api/recipes/unlock_recipes.py +3 -2
  91. uncountable/types/api/runsheet/__init__.py +1 -0
  92. uncountable/types/api/runsheet/complete_async_upload.py +41 -0
  93. uncountable/types/api/triggers/run_trigger.py +3 -2
  94. uncountable/types/api/uploader/invoke_uploader.py +2 -2
  95. uncountable/types/async_batch_processor.py +74 -0
  96. uncountable/types/async_batch_t.py +7 -5
  97. uncountable/types/auth_retrieval_t.py +4 -3
  98. uncountable/types/base_t.py +4 -0
  99. uncountable/types/calculations_t.py +1 -1
  100. uncountable/types/chemical_structure_t.py +2 -1
  101. uncountable/types/client_base.py +48 -0
  102. uncountable/types/client_config_t.py +2 -1
  103. uncountable/types/curves_t.py +2 -2
  104. uncountable/types/data_t.py +22 -21
  105. uncountable/types/entity_t.py +9 -3
  106. uncountable/types/experiment_groups_t.py +1 -1
  107. uncountable/types/field_values_t.py +20 -20
  108. uncountable/types/fields_t.py +1 -1
  109. uncountable/types/generic_upload_t.py +7 -6
  110. uncountable/types/id_source_t.py +5 -4
  111. uncountable/types/identifier_t.py +3 -3
  112. uncountable/types/input_attributes_t.py +1 -1
  113. uncountable/types/inputs_t.py +1 -1
  114. uncountable/types/integration_server_t.py +2 -1
  115. uncountable/types/job_definition_t.py +14 -13
  116. uncountable/types/outputs_t.py +1 -1
  117. uncountable/types/overrides_t.py +3 -2
  118. uncountable/types/phases_t.py +1 -1
  119. uncountable/types/queued_job_t.py +7 -7
  120. uncountable/types/recipe_identifiers_t.py +3 -3
  121. uncountable/types/recipe_links_t.py +1 -1
  122. uncountable/types/recipe_metadata_t.py +3 -3
  123. uncountable/types/recipe_output_metadata_t.py +1 -1
  124. uncountable/types/recipe_tags_t.py +1 -1
  125. uncountable/types/recipe_workflow_steps_t.py +5 -4
  126. uncountable/types/recipes_t.py +2 -1
  127. uncountable/types/response_t.py +2 -1
  128. uncountable/types/secret_retrieval_t.py +4 -3
  129. uncountable/types/units_t.py +1 -1
  130. uncountable/types/users_t.py +1 -1
  131. uncountable/types/webhook_job_t.py +4 -3
  132. uncountable/types/workflows_t.py +2 -2
  133. {uncountablepythonsdk-0.0.110.dist-info → uncountablepythonsdk-0.0.112.dist-info}/METADATA +2 -1
  134. {uncountablepythonsdk-0.0.110.dist-info → uncountablepythonsdk-0.0.112.dist-info}/RECORD +136 -128
  135. {uncountablepythonsdk-0.0.110.dist-info → uncountablepythonsdk-0.0.112.dist-info}/WHEEL +1 -1
  136. {uncountablepythonsdk-0.0.110.dist-info → uncountablepythonsdk-0.0.112.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,9 @@
1
1
  import base64
2
+ import datetime
2
3
  import re
3
4
  import typing
4
5
  from dataclasses import dataclass
5
- from datetime import datetime, timedelta
6
+ from datetime import UTC, timedelta
6
7
  from enum import StrEnum
7
8
  from io import BytesIO
8
9
  from urllib.parse import unquote, urljoin
@@ -145,7 +146,7 @@ class SDKError(Exception):
145
146
  @dataclass(kw_only=True)
146
147
  class OAuthBearerTokenCache:
147
148
  token: str
148
- expires_at: datetime
149
+ expires_at: datetime.datetime
149
150
 
150
151
 
151
152
  @dataclass(kw_only=True)
@@ -274,7 +275,8 @@ class Client(ClientMethods):
274
275
  if (
275
276
  self._oauth_bearer_token_cache is None
276
277
  or (
277
- self._oauth_bearer_token_cache.expires_at - datetime.now()
278
+ self._oauth_bearer_token_cache.expires_at
279
+ - datetime.datetime.now(tz=UTC)
278
280
  ).total_seconds()
279
281
  < OAUTH_REFRESH_WINDOW_SECONDS
280
282
  ):
@@ -290,7 +292,8 @@ class Client(ClientMethods):
290
292
  token_data = oauth_bearer_token_data_parser.parse_storage(data)
291
293
  self._oauth_bearer_token_cache = OAuthBearerTokenCache(
292
294
  token=token_data.access_token,
293
- expires_at=datetime.now() + timedelta(seconds=token_data.expires_in),
295
+ expires_at=datetime.datetime.now(tz=UTC)
296
+ + timedelta(seconds=token_data.expires_in),
294
297
  )
295
298
 
296
299
  return self._oauth_bearer_token_cache.token
@@ -1,7 +1,8 @@
1
+ import datetime
1
2
  import io
2
3
  import os
3
4
  import re
4
- from datetime import datetime, timezone
5
+ from datetime import UTC
5
6
 
6
7
  import paramiko
7
8
 
@@ -164,7 +165,7 @@ def _move_files_post_upload(
164
165
  appended_text = ""
165
166
 
166
167
  if remote_directory_scope.prepend_date_on_archive:
167
- appended_text = f"-{datetime.now(timezone.utc).timestamp()}"
168
+ appended_text = f"-{datetime.datetime.now(UTC).timestamp()}"
168
169
 
169
170
  for file_path in success_file_paths:
170
171
  filename = os.path.split(file_path)[-1]
@@ -6,8 +6,9 @@ from dataclasses import dataclass
6
6
  from pkgs.argument_parser import CachedParser
7
7
  from uncountable.core.async_batch import AsyncBatchProcessor
8
8
  from uncountable.core.client import Client
9
+ from uncountable.core.file_upload import FileUpload
9
10
  from uncountable.integration.telemetry import JobLogger
10
- from uncountable.types import base_t, webhook_job_t
11
+ from uncountable.types import base_t, entity_t, webhook_job_t
11
12
  from uncountable.types.job_definition_t import JobDefinition, JobResult, ProfileMetadata
12
13
 
13
14
 
@@ -91,3 +92,25 @@ class RunsheetWebhookJob(WebhookJob[webhook_job_t.RunsheetWebhookPayload]):
91
92
  @property
92
93
  def webhook_payload_type(self) -> type:
93
94
  return webhook_job_t.RunsheetWebhookPayload
95
+
96
+ @abstractmethod
97
+ def build_runsheet(
98
+ self,
99
+ *,
100
+ args: JobArguments,
101
+ entities: list[entity_t.Entity],
102
+ ) -> FileUpload: ...
103
+
104
+ def run(
105
+ self, args: JobArguments, payload: webhook_job_t.RunsheetWebhookPayload
106
+ ) -> JobResult:
107
+ runsheet = self.build_runsheet(args=args, entities=payload.entities)
108
+
109
+ files = args.client.upload_files(file_uploads=[runsheet])
110
+ args.client.complete_async_upload(
111
+ async_job_id=payload.async_job_id, file_id=files[0].file_id
112
+ )
113
+
114
+ return JobResult(
115
+ success=True,
116
+ )
@@ -1,5 +1,6 @@
1
+ import datetime
1
2
  import uuid
2
- from datetime import datetime, timezone
3
+ from datetime import UTC
3
4
 
4
5
  from sqlalchemy import delete, insert, select, update
5
6
  from sqlalchemy.engine import Engine
@@ -30,7 +31,7 @@ class DatastoreSqlite(Datastore):
30
31
  serialized_payload = serialize_for_storage(job_payload)
31
32
  queued_job_uuid = str(uuid.uuid4())
32
33
  num_attempts = 0
33
- submitted_at = datetime.now(timezone.utc)
34
+ submitted_at = datetime.datetime.now(UTC)
34
35
  insert_stmt = insert(QueuedJob).values({
35
36
  QueuedJob.id.key: queued_job_uuid,
36
37
  QueuedJob.job_ref_name.key: job_ref_name,
@@ -1,9 +1,10 @@
1
+ import datetime
1
2
  import multiprocessing
2
3
  import subprocess
3
4
  import sys
4
5
  import time
5
6
  from dataclasses import dataclass
6
- from datetime import datetime, timezone
7
+ from datetime import UTC
7
8
 
8
9
  from opentelemetry.trace import get_current_span
9
10
 
@@ -96,7 +97,7 @@ def _wait_queue_runner_online() -> None:
96
97
  QUEUE_RUNNER_HEALTH_CHECK_DELAY_SECS = 1
97
98
 
98
99
  num_attempts = 0
99
- before = datetime.now(timezone.utc)
100
+ before = datetime.datetime.now(UTC)
100
101
  while num_attempts < MAX_QUEUE_RUNNER_HEALTH_CHECKS:
101
102
  try:
102
103
  if check_health(port=get_local_admin_server_port()):
@@ -105,7 +106,7 @@ def _wait_queue_runner_online() -> None:
105
106
  pass
106
107
  num_attempts += 1
107
108
  time.sleep(QUEUE_RUNNER_HEALTH_CHECK_DELAY_SECS)
108
- after = datetime.now(timezone.utc)
109
+ after = datetime.datetime.now(UTC)
109
110
  duration_secs = (after - before).seconds
110
111
  raise Exception(f"queue runner failed to come online after {duration_secs} seconds")
111
112
 
@@ -16,6 +16,7 @@ from . import calculations_t as calculations_t
16
16
  from . import chemical_structure_t as chemical_structure_t
17
17
  from .api.recipes import clear_recipe_outputs as clear_recipe_outputs_t
18
18
  from . import client_config_t as client_config_t
19
+ from .api.runsheet import complete_async_upload as complete_async_upload_t
19
20
  from .api.chemical import convert_chemical_formats as convert_chemical_formats_t
20
21
  from .api.entity import create_entities as create_entities_t
21
22
  from .api.entity import create_entity as create_entity_t
@@ -107,6 +108,7 @@ from . import units_t as units_t
107
108
  from .api.entity import unlock_entity as unlock_entity_t
108
109
  from .api.recipes import unlock_recipes as unlock_recipes_t
109
110
  from .api.material_families import update_entity_material_families as update_entity_material_families_t
111
+ from .api.condition_parameters import upsert_condition_match as upsert_condition_match_t
110
112
  from .api.field_options import upsert_field_options as upsert_field_options_t
111
113
  from . import users_t as users_t
112
114
  from . import webhook_job_t as webhook_job_t
@@ -128,6 +130,7 @@ __all__: list[str] = [
128
130
  "chemical_structure_t",
129
131
  "clear_recipe_outputs_t",
130
132
  "client_config_t",
133
+ "complete_async_upload_t",
131
134
  "convert_chemical_formats_t",
132
135
  "create_entities_t",
133
136
  "create_entity_t",
@@ -219,6 +222,7 @@ __all__: list[str] = [
219
222
  "unlock_entity_t",
220
223
  "unlock_recipes_t",
221
224
  "update_entity_material_families_t",
225
+ "upsert_condition_match_t",
222
226
  "upsert_field_options_t",
223
227
  "users_t",
224
228
  "webhook_job_t",
@@ -43,7 +43,7 @@ class RequestMethod(StrEnum):
43
43
  named_type_path="sdk.api.batch.execute_batch.BatchRequest",
44
44
  unconverted_values={"data"},
45
45
  )
46
- @dataclasses.dataclass(kw_only=True)
46
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
47
47
  class BatchRequest:
48
48
  path: str
49
49
  method: RequestMethod
@@ -54,7 +54,7 @@ class BatchRequest:
54
54
  @serial_class(
55
55
  named_type_path="sdk.api.batch.execute_batch.Arguments",
56
56
  )
57
- @dataclasses.dataclass(kw_only=True)
57
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
58
58
  class Arguments:
59
59
  requests: list[BatchRequest]
60
60
 
@@ -64,7 +64,7 @@ class Arguments:
64
64
  named_type_path="sdk.api.batch.execute_batch.BatchResponse",
65
65
  unconverted_values={"response"},
66
66
  )
67
- @dataclasses.dataclass(kw_only=True)
67
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
68
68
  class BatchResponse:
69
69
  path: str
70
70
  method: RequestMethod
@@ -76,7 +76,7 @@ class BatchResponse:
76
76
  @serial_class(
77
77
  named_type_path="sdk.api.batch.execute_batch.Data",
78
78
  )
79
- @dataclasses.dataclass(kw_only=True)
79
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
80
80
  class Data:
81
81
  responses: list[BatchResponse]
82
82
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -26,7 +26,7 @@ ENDPOINT_PATH = "api/external/batch/execute_batch_load_async"
26
26
  @serial_class(
27
27
  named_type_path="sdk.api.batch.execute_batch_load_async.Arguments",
28
28
  )
29
- @dataclasses.dataclass(kw_only=True)
29
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
30
30
  class Arguments:
31
31
  requests: list[async_batch_t.AsyncBatchRequest]
32
32
 
@@ -35,7 +35,7 @@ class Arguments:
35
35
  @serial_class(
36
36
  named_type_path="sdk.api.batch.execute_batch_load_async.Data",
37
37
  )
38
- @dataclasses.dataclass(kw_only=True)
38
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
39
39
  class Data:
40
40
  job_id: base_t.ObjectId
41
41
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -28,7 +28,7 @@ ENDPOINT_PATH = "api/external/chemical/convert_chemical_formats"
28
28
  @serial_class(
29
29
  named_type_path="sdk.api.chemical.convert_chemical_formats.ChemicalStructureFile",
30
30
  )
31
- @dataclasses.dataclass(kw_only=True)
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
32
  class ChemicalStructureFile:
33
33
  struct_file: str
34
34
 
@@ -37,7 +37,7 @@ class ChemicalStructureFile:
37
37
  @serial_class(
38
38
  named_type_path="sdk.api.chemical.convert_chemical_formats.Arguments",
39
39
  )
40
- @dataclasses.dataclass(kw_only=True)
40
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
41
  class Arguments:
42
42
  source_chemical_structures: list[ChemicalStructureFile]
43
43
 
@@ -56,7 +56,7 @@ UncountableChemicalStructure = typing.Annotated[
56
56
  named_type_path="sdk.api.chemical.convert_chemical_formats.Data",
57
57
  unconverted_values={"chemical_structures"},
58
58
  )
59
- @dataclasses.dataclass(kw_only=True)
59
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
60
60
  class Data:
61
61
  chemical_structures: list[UncountableChemicalStructure]
62
62
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,72 @@
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 async_batch_t
13
+ from ... import base_t
14
+ from ... import identifier_t
15
+
16
+ __all__: list[str] = [
17
+ "Arguments",
18
+ "ConditionParameter",
19
+ "Data",
20
+ "ENDPOINT_METHOD",
21
+ "ENDPOINT_PATH",
22
+ "MatchType",
23
+ ]
24
+
25
+ ENDPOINT_METHOD = "POST"
26
+ ENDPOINT_PATH = "api/external/condition_parameters/upsert_condition_match"
27
+
28
+
29
+ # DO NOT MODIFY -- This file is generated by type_spec
30
+ @serial_class(
31
+ named_type_path="sdk.api.condition_parameters.upsert_condition_match.ConditionParameter",
32
+ to_string_values={"max_value", "min_value"},
33
+ )
34
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
35
+ class ConditionParameter:
36
+ condition_parameter_key: identifier_t.IdentifierKey
37
+ allow_null: bool
38
+ min_value: Decimal | None = None
39
+ max_value: Decimal | None = None
40
+ categorical_values: list[str | None] | None = None
41
+ match_type: MatchType | None = None
42
+
43
+
44
+ # DO NOT MODIFY -- This file is generated by type_spec
45
+ class MatchType(StrEnum):
46
+ ALL = "all"
47
+ EQ = "eq"
48
+ EQCATEGORICAL = "eqCategorical"
49
+ RANGE = "range"
50
+
51
+
52
+ # DO NOT MODIFY -- This file is generated by type_spec
53
+ @serial_class(
54
+ named_type_path="sdk.api.condition_parameters.upsert_condition_match.Arguments",
55
+ )
56
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
57
+ class Arguments:
58
+ explicit_name: bool = False
59
+ name: str | None = None
60
+ condition_parameters: list[ConditionParameter] | None = None
61
+ output_conditions: list[identifier_t.IdentifierKey] | None = None
62
+ existing_condition_match: identifier_t.IdentifierKey | None = None
63
+
64
+
65
+ # DO NOT MODIFY -- This file is generated by type_spec
66
+ @serial_class(
67
+ named_type_path="sdk.api.condition_parameters.upsert_condition_match.Data",
68
+ )
69
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
70
+ class Data(async_batch_t.AsyncBatchActionReturn):
71
+ pass
72
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -29,7 +29,7 @@ ENDPOINT_PATH = "api/external/entity/external_create_entities"
29
29
  @serial_class(
30
30
  named_type_path="sdk.api.entity.create_entities.EntityToCreate",
31
31
  )
32
- @dataclasses.dataclass(kw_only=True)
32
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
33
33
  class EntityToCreate:
34
34
  field_values: list[field_values_t.FieldRefNameValue] | None = None
35
35
  parent_entity: entity_t.Entity | None = None
@@ -39,7 +39,7 @@ class EntityToCreate:
39
39
  @serial_class(
40
40
  named_type_path="sdk.api.entity.create_entities.Arguments",
41
41
  )
42
- @dataclasses.dataclass(kw_only=True)
42
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
43
43
  class Arguments:
44
44
  entity_type: entity_t.LimitedEntityType
45
45
  entities_to_create: list[EntityToCreate]
@@ -51,7 +51,7 @@ class Arguments:
51
51
  @serial_class(
52
52
  named_type_path="sdk.api.entity.create_entities.Data",
53
53
  )
54
- @dataclasses.dataclass(kw_only=True)
54
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
55
55
  class Data:
56
56
  entities: list[entity_t.Entity]
57
57
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -30,7 +30,7 @@ ENDPOINT_PATH = "api/external/entity/external_create_entity"
30
30
  named_type_path="sdk.api.entity.create_entity.EntityFieldInitialValue",
31
31
  unconverted_values={"value"},
32
32
  )
33
- @dataclasses.dataclass(kw_only=True)
33
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
34
34
  class EntityFieldInitialValue:
35
35
  field_ref_name: str
36
36
  value: base_t.JsonValue
@@ -41,7 +41,7 @@ class EntityFieldInitialValue:
41
41
  @serial_class(
42
42
  named_type_path="sdk.api.entity.create_entity.Arguments",
43
43
  )
44
- @dataclasses.dataclass(kw_only=True)
44
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
45
45
  class Arguments:
46
46
  entity_type: entity_t.LimitedEntityType
47
47
  definition_id: base_t.ObjectId | None = None
@@ -54,7 +54,7 @@ class Arguments:
54
54
  @serial_class(
55
55
  named_type_path="sdk.api.entity.create_entity.Data",
56
56
  )
57
- @dataclasses.dataclass(kw_only=True)
57
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
58
58
  class Data:
59
59
  entity: entity_t.Entity
60
60
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -9,6 +9,7 @@ from decimal import Decimal # noqa: F401
9
9
  import dataclasses
10
10
  from pkgs.serialization import serial_class
11
11
  from ... import async_batch_t
12
+ from ... import base_t
12
13
  from ... import entity_t
13
14
  from ... import field_values_t
14
15
  from ... import identifier_t
@@ -28,7 +29,7 @@ ENDPOINT_PATH = "api/external/entity/create_or_update_entity"
28
29
  @serial_class(
29
30
  named_type_path="sdk.api.entity.create_or_update_entity.Arguments",
30
31
  )
31
- @dataclasses.dataclass(kw_only=True)
32
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
33
  class Arguments:
33
34
  entity_type: entity_t.EntityType
34
35
  definition_key: identifier_t.IdentifierKey
@@ -40,7 +41,7 @@ class Arguments:
40
41
  @serial_class(
41
42
  named_type_path="sdk.api.entity.create_or_update_entity.Data",
42
43
  )
43
- @dataclasses.dataclass(kw_only=True)
44
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
45
  class Data(async_batch_t.AsyncBatchActionReturn):
45
46
  pass
46
47
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -28,7 +28,7 @@ ENDPOINT_PATH = "api/external/entity/external_get_entities_data"
28
28
  @serial_class(
29
29
  named_type_path="sdk.api.entity.get_entities_data.Arguments",
30
30
  )
31
- @dataclasses.dataclass(kw_only=True)
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
32
  class Arguments:
33
33
  entity_ids: list[base_t.ObjectId]
34
34
  entity_type: entity_t.EntityType
@@ -38,7 +38,7 @@ class Arguments:
38
38
  @serial_class(
39
39
  named_type_path="sdk.api.entity.get_entities_data.EntityDetails",
40
40
  )
41
- @dataclasses.dataclass(kw_only=True)
41
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
42
42
  class EntityDetails:
43
43
  entity: entity_t.Entity
44
44
  field_values: list[field_values_t.FieldRefIdNameValue]
@@ -48,7 +48,7 @@ class EntityDetails:
48
48
  @serial_class(
49
49
  named_type_path="sdk.api.entity.get_entities_data.Data",
50
50
  )
51
- @dataclasses.dataclass(kw_only=True)
51
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
52
52
  class Data:
53
53
  entity_details: list[EntityDetails]
54
54
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -9,6 +9,7 @@ from decimal import Decimal # noqa: F401
9
9
  import dataclasses
10
10
  from pkgs.serialization import serial_class
11
11
  from ... import async_batch_t
12
+ from ... import base_t
12
13
  from ... import entity_t
13
14
  from ... import identifier_t
14
15
 
@@ -27,7 +28,7 @@ ENDPOINT_PATH = "api/external/entity/grant_entity_permissions"
27
28
  @serial_class(
28
29
  named_type_path="sdk.api.entity.grant_entity_permissions.Arguments",
29
30
  )
30
- @dataclasses.dataclass(kw_only=True)
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
32
  class Arguments:
32
33
  entity_type: entity_t.LimitedEntityType
33
34
  entity_key: identifier_t.IdentifierKey
@@ -41,7 +42,7 @@ class Arguments:
41
42
  @serial_class(
42
43
  named_type_path="sdk.api.entity.grant_entity_permissions.Data",
43
44
  )
44
- @dataclasses.dataclass(kw_only=True)
45
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
45
46
  class Data(async_batch_t.AsyncBatchActionReturn):
46
47
  pass
47
48
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -30,7 +30,7 @@ ENDPOINT_PATH = "api/external/entity/external_list_entities"
30
30
  named_type_path="sdk.api.entity.list_entities.Arguments",
31
31
  unconverted_values={"attributes"},
32
32
  )
33
- @dataclasses.dataclass(kw_only=True)
33
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
34
34
  class Arguments:
35
35
  config_reference: str
36
36
  entity_type: entity_t.EntityType | None = None
@@ -44,7 +44,7 @@ class Arguments:
44
44
  named_type_path="sdk.api.entity.list_entities.EntityResult",
45
45
  unconverted_values={"column_values"},
46
46
  )
47
- @dataclasses.dataclass(kw_only=True)
47
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
48
48
  class EntityResult:
49
49
  entity: entity_t.Entity
50
50
  column_values: list[base_t.JsonValue]
@@ -54,7 +54,7 @@ class EntityResult:
54
54
  @serial_class(
55
55
  named_type_path="sdk.api.entity.list_entities.ColumnAccess",
56
56
  )
57
- @dataclasses.dataclass(kw_only=True)
57
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
58
58
  class ColumnAccess:
59
59
  name: str
60
60
  table_label: str | None
@@ -64,7 +64,7 @@ class ColumnAccess:
64
64
  @serial_class(
65
65
  named_type_path="sdk.api.entity.list_entities.Data",
66
66
  )
67
- @dataclasses.dataclass(kw_only=True)
67
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
68
68
  class Data:
69
69
  columns: list[ColumnAccess]
70
70
  results: list[EntityResult]
@@ -9,6 +9,7 @@ from decimal import Decimal # noqa: F401
9
9
  import dataclasses
10
10
  from pkgs.serialization import serial_class
11
11
  from ... import async_batch_t
12
+ from ... import base_t
12
13
  from ... import entity_t
13
14
  from ... import identifier_t
14
15
 
@@ -27,7 +28,7 @@ ENDPOINT_PATH = "api/external/entity/external_lock_entity"
27
28
  @serial_class(
28
29
  named_type_path="sdk.api.entity.lock_entity.Arguments",
29
30
  )
30
- @dataclasses.dataclass(kw_only=True)
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
32
  class Arguments:
32
33
  entity_key: identifier_t.IdentifierKey
33
34
  entity_type: entity_t.EntityType
@@ -38,7 +39,7 @@ class Arguments:
38
39
  @serial_class(
39
40
  named_type_path="sdk.api.entity.lock_entity.Data",
40
41
  )
41
- @dataclasses.dataclass(kw_only=True)
42
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
42
43
  class Data(async_batch_t.AsyncBatchActionReturn):
43
44
  pass
44
45
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -41,7 +41,7 @@ class LookupEntityQueryType(StrEnum):
41
41
  @serial_class(
42
42
  named_type_path="sdk.api.entity.lookup_entity.LookupEntityQueryBase",
43
43
  )
44
- @dataclasses.dataclass(kw_only=True)
44
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
45
45
  class LookupEntityQueryBase:
46
46
  type: LookupEntityQueryType
47
47
 
@@ -51,7 +51,7 @@ class LookupEntityQueryBase:
51
51
  named_type_path="sdk.api.entity.lookup_entity.LookupFieldArgumentValue",
52
52
  unconverted_values={"field_value"},
53
53
  )
54
- @dataclasses.dataclass(kw_only=True)
54
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
55
55
  class LookupFieldArgumentValue:
56
56
  field_key: identifier_t.IdentifierKey
57
57
  field_value: base_t.JsonValue
@@ -63,7 +63,7 @@ class LookupFieldArgumentValue:
63
63
  named_type_path="sdk.api.entity.lookup_entity.LookupEntityFieldValue",
64
64
  parse_require={"type"},
65
65
  )
66
- @dataclasses.dataclass(kw_only=True)
66
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
67
67
  class LookupEntityFieldValue:
68
68
  type: typing.Literal[LookupEntityQueryType.FIELD_VALUE] = LookupEntityQueryType.FIELD_VALUE
69
69
  value: LookupFieldArgumentValue
@@ -86,7 +86,7 @@ LookupEntityQuery = typing.Annotated[
86
86
  @serial_class(
87
87
  named_type_path="sdk.api.entity.lookup_entity.Arguments",
88
88
  )
89
- @dataclasses.dataclass(kw_only=True)
89
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
90
90
  class Arguments:
91
91
  entity_type: entity_t.EntityType
92
92
  query: LookupEntityQuery
@@ -96,7 +96,7 @@ class Arguments:
96
96
  @serial_class(
97
97
  named_type_path="sdk.api.entity.lookup_entity.Data",
98
98
  )
99
- @dataclasses.dataclass(kw_only=True)
99
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
100
100
  class Data(async_batch_t.AsyncBatchActionReturn):
101
101
  pass
102
102
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -27,7 +27,7 @@ ENDPOINT_PATH = "api/external/entity/external_resolve_entity_ids"
27
27
  @serial_class(
28
28
  named_type_path="sdk.api.entity.resolve_entity_ids.Arguments",
29
29
  )
30
- @dataclasses.dataclass(kw_only=True)
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
31
  class Arguments:
32
32
  entity_ids: list[str | base_t.ObjectId]
33
33
  entity_type: entity_t.EntityType
@@ -37,7 +37,7 @@ class Arguments:
37
37
  @serial_class(
38
38
  named_type_path="sdk.api.entity.resolve_entity_ids.EntityNames",
39
39
  )
40
- @dataclasses.dataclass(kw_only=True)
40
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
41
  class EntityNames:
42
42
  id: str | int
43
43
  name: str
@@ -47,7 +47,7 @@ class EntityNames:
47
47
  @serial_class(
48
48
  named_type_path="sdk.api.entity.resolve_entity_ids.Data",
49
49
  )
50
- @dataclasses.dataclass(kw_only=True)
50
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
51
51
  class Data:
52
52
  items: list[EntityNames]
53
53
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -9,6 +9,7 @@ from decimal import Decimal # noqa: F401
9
9
  import dataclasses
10
10
  from pkgs.serialization import serial_class
11
11
  from ... import async_batch_t
12
+ from ... import base_t
12
13
  from ... import entity_t
13
14
  from ... import field_values_t
14
15
 
@@ -27,7 +28,7 @@ ENDPOINT_PATH = "api/external/entity/set_entity_field_values"
27
28
  @serial_class(
28
29
  named_type_path="sdk.api.entity.set_entity_field_values.Arguments",
29
30
  )
30
- @dataclasses.dataclass(kw_only=True)
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
32
  class Arguments:
32
33
  entity_identifier: entity_t.EntityIdentifier
33
34
  field_values: list[field_values_t.FieldArgumentValue]
@@ -37,7 +38,7 @@ class Arguments:
37
38
  @serial_class(
38
39
  named_type_path="sdk.api.entity.set_entity_field_values.Data",
39
40
  )
40
- @dataclasses.dataclass(kw_only=True)
41
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
42
  class Data(async_batch_t.AsyncBatchActionReturn):
42
43
  pass
43
44
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -8,6 +8,7 @@ import datetime # noqa: F401
8
8
  from decimal import Decimal # noqa: F401
9
9
  import dataclasses
10
10
  from pkgs.serialization import serial_class
11
+ from ... import base_t
11
12
  from ... import entity_t
12
13
  from ... import field_values_t
13
14
  from ... import response_t
@@ -27,7 +28,7 @@ ENDPOINT_PATH = "api/external/entity/external_set_values"
27
28
  @serial_class(
28
29
  named_type_path="sdk.api.entity.set_values.Arguments",
29
30
  )
30
- @dataclasses.dataclass(kw_only=True)
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
32
  class Arguments:
32
33
  entity: entity_t.Entity
33
34
  values: list[field_values_t.ArgumentValueRefName]
@@ -37,7 +38,7 @@ class Arguments:
37
38
  @serial_class(
38
39
  named_type_path="sdk.api.entity.set_values.Data",
39
40
  )
40
- @dataclasses.dataclass(kw_only=True)
41
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
42
  class Data(response_t.Response):
42
43
  pass
43
44
  # DO NOT MODIFY -- This file is generated by type_spec