UncountablePythonSDK 0.0.112__py3-none-any.whl → 0.0.114__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 (28) hide show
  1. examples/integration-server/jobs/materials_auto/concurrent_cron.py +11 -0
  2. examples/integration-server/jobs/materials_auto/profile.yaml +19 -0
  3. pkgs/argument_parser/argument_parser.py +8 -3
  4. pkgs/filesystem_utils/_blob_session.py +8 -1
  5. pkgs/type_spec/builder.py +8 -2
  6. pkgs/type_spec/non_discriminated_union_exceptions.py +14 -0
  7. pkgs/type_spec/parts/base.py.prepart +5 -8
  8. pkgs/type_spec/value_spec/__main__.py +2 -2
  9. uncountable/integration/queue_runner/job_scheduler.py +10 -2
  10. uncountable/integration/scan_profiles.py +1 -1
  11. uncountable/integration/secret_retrieval/retrieve_secret.py +1 -1
  12. uncountable/types/__init__.py +6 -0
  13. uncountable/types/api/entity/export_entities.py +46 -0
  14. uncountable/types/api/recipes/create_mix_order.py +44 -0
  15. uncountable/types/api/recipes/set_recipe_outputs.py +2 -1
  16. uncountable/types/async_batch_processor.py +34 -0
  17. uncountable/types/async_batch_t.py +1 -0
  18. uncountable/types/base_t.py +5 -8
  19. uncountable/types/data.py +2 -2
  20. uncountable/types/data_t.py +37 -28
  21. uncountable/types/entity_t.py +1 -1
  22. uncountable/types/exports.py +8 -0
  23. uncountable/types/exports_t.py +33 -0
  24. uncountable/types/job_definition_t.py +1 -0
  25. {uncountablepythonsdk-0.0.112.dist-info → uncountablepythonsdk-0.0.114.dist-info}/METADATA +1 -1
  26. {uncountablepythonsdk-0.0.112.dist-info → uncountablepythonsdk-0.0.114.dist-info}/RECORD +28 -22
  27. {uncountablepythonsdk-0.0.112.dist-info → uncountablepythonsdk-0.0.114.dist-info}/WHEEL +1 -1
  28. {uncountablepythonsdk-0.0.112.dist-info → uncountablepythonsdk-0.0.114.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,11 @@
1
+ import time
2
+
3
+ from uncountable.integration.job import CronJob, JobArguments, register_job
4
+ from uncountable.types.job_definition_t import JobResult
5
+
6
+
7
+ @register_job
8
+ class MyConcurrentCronJob(CronJob):
9
+ def run(self, args: JobArguments) -> JobResult:
10
+ time.sleep(10)
11
+ return JobResult(success=True)
@@ -22,6 +22,25 @@ jobs:
22
22
  - admin:
23
23
  type: ref_name
24
24
  ref_name: admin
25
+ - id: concurrent_cron_1
26
+ enabled: true
27
+ type: cron
28
+ name: MyConcurrentCron - 1
29
+ cron_spec: "* * * * *"
30
+ executor:
31
+ type: script
32
+ import_path: concurrent_cron
33
+ subqueue_name: subqueue_1
34
+ - id: concurrent_cron_2
35
+ enabled: true
36
+ type: cron
37
+ name: MyConcurrentCron - 2
38
+ cron_spec: "* * * * *"
39
+ executor:
40
+ type: script
41
+ import_path: concurrent_cron
42
+ subqueue_name: subqueue_2
43
+
25
44
 
26
45
  - id: example_wh1
27
46
  type: webhook
@@ -170,9 +170,15 @@ def _invoke_membership_parser(
170
170
 
171
171
  def _build_parser_discriminated_union(
172
172
  context: ParserContext,
173
- discriminator: str,
173
+ discriminator_raw: str,
174
174
  discriminator_map: dict[str, ParserFunction[T]],
175
175
  ) -> ParserFunction[T]:
176
+ discriminator = (
177
+ snake_to_camel_case(discriminator_raw)
178
+ if context.options.from_camel_case
179
+ else discriminator_raw
180
+ )
181
+
176
182
  def parse(value: typing.Any) -> typing.Any:
177
183
  if context.options.allow_direct_type and dataclasses.is_dataclass(value):
178
184
  discriminant = getattr(value, discriminator)
@@ -414,8 +420,7 @@ def _build_parser_dataclass(
414
420
  cur_parser = context.cache.get(parsed_type)
415
421
  if cur_parser is not None:
416
422
  return cur_parser
417
-
418
- type_hints = typing.get_type_hints(parsed_type)
423
+ type_hints = typing.get_type_hints(parsed_type, include_extras=True)
419
424
  dc_field_parsers: list[
420
425
  tuple[
421
426
  dataclasses.Field[typing.Any],
@@ -1,5 +1,6 @@
1
1
  from io import BytesIO
2
2
 
3
+ from azure.core.credentials import AzureSasCredential
3
4
  from azure.storage.blob import BlobServiceClient, ContainerClient
4
5
 
5
6
  from pkgs.filesystem_utils.file_type_utils import (
@@ -122,7 +123,13 @@ class BlobSession(FileSystemSession):
122
123
  )
123
124
  dest_blob_client = self.container_client.get_blob_client(dest_file.filepath)
124
125
 
125
- dest_blob_client.start_copy_from_url(source_blob_client.url)
126
+ source_url = (
127
+ f"{source_blob_client.url}?{self.config.credential.signature}"
128
+ if isinstance(self.config.credential, AzureSasCredential)
129
+ else source_blob_client.url
130
+ )
131
+
132
+ dest_blob_client.start_copy_from_url(source_url)
126
133
  source_blob_client.delete_blob()
127
134
 
128
135
  def delete_files(self, filepaths: list[FileSystemObject]) -> None:
pkgs/type_spec/builder.py CHANGED
@@ -14,6 +14,7 @@ from typing import Any, Self
14
14
 
15
15
  from . import util
16
16
  from .cross_output_links import CrossOutputPaths
17
+ from .non_discriminated_union_exceptions import NON_DISCRIMINATED_UNION_EXCEPTIONS
17
18
  from .util import parse_type_str, unused
18
19
 
19
20
  RawDict = dict[Any, Any]
@@ -636,6 +637,11 @@ class SpecTypeDefnUnion(SpecTypeDefn):
636
637
  self.discriminator_map[discriminant] = sub_type
637
638
 
638
639
  builder.pop_where()
640
+ elif (
641
+ f"{self.namespace.name}.{self.name}"
642
+ not in NON_DISCRIMINATED_UNION_EXCEPTIONS
643
+ ):
644
+ raise Exception(f"union requires a discriminator: {self.name}")
639
645
 
640
646
  def get_referenced_types(self) -> list[SpecType]:
641
647
  return self.types
@@ -960,8 +966,8 @@ class SpecEndpoint:
960
966
  elif isinstance(is_sdk, str):
961
967
  try:
962
968
  is_sdk = EndpointEmitType(is_sdk)
963
- except ValueError:
964
- raise ValueError(f"Invalid value for is_sdk: {is_sdk}")
969
+ except ValueError as e:
970
+ raise ValueError(f"Invalid value for is_sdk: {is_sdk}") from e
965
971
 
966
972
  assert isinstance(is_sdk, EndpointEmitType)
967
973
 
@@ -0,0 +1,14 @@
1
+ NON_DISCRIMINATED_UNION_EXCEPTIONS = [
2
+ "generate_tool_parameters.UnionWithoutDiscrim",
3
+ "output_calculation_entities.ConditionParameterFilterCondition",
4
+ "output_parameters.AnalyticalMethodParameterOptions",
5
+ "output_parameters.AnalyticalMethodLinkedOptionValue",
6
+ "recipes_redirect.RecipesRedirectResult",
7
+ "value_spec.ResolvedPathAll",
8
+ "weighted_sum.WeightedSumEntities",
9
+ "workflows.WorkflowTotalDisplay",
10
+ "type_info.TypeFormActionConstraint",
11
+ "structured_loading.CompatibleFilterNode",
12
+ "structured_display_element.DisplayElementColumn",
13
+ "field_values.FieldValue",
14
+ ]
@@ -58,15 +58,12 @@ def is_pure_json_value(value: ExtJsonValue) -> bool:
58
58
  return True
59
59
 
60
60
  if isinstance(value, list):
61
- for item in value:
62
- if not is_pure_json_value(item):
63
- return False
64
- return True
61
+ return all(is_pure_json_value(item) for item in value)
65
62
 
66
63
  if isinstance(value, dict):
67
- for key, item in value.items():
68
- if not is_pure_json_value(key) or not is_pure_json_value(item):
69
- return False
70
- return True
64
+ return all(
65
+ is_pure_json_value(key) and is_pure_json_value(item)
66
+ for key, item in value.items()
67
+ )
71
68
 
72
69
  return False
@@ -104,8 +104,8 @@ def parse_function_signature(text: str) -> ParsedFunctionSignature:
104
104
 
105
105
  type_str = source.extract_type()
106
106
  ref_name = arg_group.group(1)
107
- is_missing = arg_group.group(2) == "?"
108
- is_repeating = arg_group.group(2) == "+"
107
+ # is_missing = arg_group.group(2) == "?"
108
+ # is_repeating = arg_group.group(2) == "+"
109
109
  type_path = parse_type_str(type_str)
110
110
 
111
111
  match arg_group.group(3):
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ import sys
2
3
  import typing
3
4
  from concurrent.futures import ProcessPoolExecutor
4
5
  from dataclasses import dataclass
@@ -34,6 +35,10 @@ class JobListenerKey:
34
35
  def _get_job_worker_key(
35
36
  job_definition: job_definition_t.JobDefinition, profile_name: str
36
37
  ) -> JobListenerKey:
38
+ if job_definition.subqueue_name is not None:
39
+ return JobListenerKey(
40
+ profile_name=profile_name, subqueue_name=job_definition.subqueue_name
41
+ )
37
42
  return JobListenerKey(profile_name=profile_name)
38
43
 
39
44
 
@@ -41,9 +46,12 @@ def on_worker_crash(
41
46
  worker_key: JobListenerKey,
42
47
  ) -> typing.Callable[[asyncio.Task], None]:
43
48
  def hook(task: asyncio.Task) -> None:
44
- raise Exception(
45
- f"worker {worker_key.profile_name}_{worker_key.subqueue_name} crashed unexpectedly"
49
+ Logger(get_current_span()).log_exception(
50
+ Exception(
51
+ f"worker {worker_key.profile_name}_{worker_key.subqueue_name} crashed unexpectedly"
52
+ )
46
53
  )
54
+ sys.exit(1)
47
55
 
48
56
  return hook
49
57
 
@@ -26,7 +26,7 @@ def load_profiles() -> list[job_definition_t.ProfileMetadata]:
26
26
  profile_name = profile_file.name
27
27
  try:
28
28
  definition = profile_parser.parse_yaml_resource(
29
- package=".".join([profiles_module, profile_name]),
29
+ package=f"{profiles_module}.{profile_name}",
30
30
  resource="profile.yaml",
31
31
  )
32
32
  for job in definition.jobs:
@@ -54,7 +54,7 @@ def _load_secret_overrides(profile_name: str) -> dict[SecretRetrieval, str]:
54
54
  profiles_module = os.environ["UNC_PROFILES_MODULE"]
55
55
  try:
56
56
  overrides = overrides_parser.parse_yaml_resource(
57
- package=".".join([profiles_module, profile_name]),
57
+ package=f"{profiles_module}.{profile_name}",
58
58
  resource="local_overrides.yaml",
59
59
  )
60
60
  return {
@@ -21,6 +21,7 @@ from .api.chemical import convert_chemical_formats as convert_chemical_formats_t
21
21
  from .api.entity import create_entities as create_entities_t
22
22
  from .api.entity import create_entity as create_entity_t
23
23
  from .api.inputs import create_inputs as create_inputs_t
24
+ from .api.recipes import create_mix_order as create_mix_order_t
24
25
  from .api.entity import create_or_update_entity as create_or_update_entity_t
25
26
  from .api.recipes import create_recipe as create_recipe_t
26
27
  from .api.recipe_links import create_recipe_link as create_recipe_link_t
@@ -34,6 +35,8 @@ from . import entity_t as entity_t
34
35
  from .api.batch import execute_batch as execute_batch_t
35
36
  from .api.batch import execute_batch_load_async as execute_batch_load_async_t
36
37
  from . import experiment_groups_t as experiment_groups_t
38
+ from .api.entity import export_entities as export_entities_t
39
+ from . import exports_t as exports_t
37
40
  from . import field_values_t as field_values_t
38
41
  from . import fields_t as fields_t
39
42
  from . import generic_upload_t as generic_upload_t
@@ -135,6 +138,7 @@ __all__: list[str] = [
135
138
  "create_entities_t",
136
139
  "create_entity_t",
137
140
  "create_inputs_t",
141
+ "create_mix_order_t",
138
142
  "create_or_update_entity_t",
139
143
  "create_recipe_t",
140
144
  "create_recipe_link_t",
@@ -148,6 +152,8 @@ __all__: list[str] = [
148
152
  "execute_batch_t",
149
153
  "execute_batch_load_async_t",
150
154
  "experiment_groups_t",
155
+ "export_entities_t",
156
+ "exports_t",
151
157
  "field_values_t",
152
158
  "fields_t",
153
159
  "generic_upload_t",
@@ -0,0 +1,46 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
12
+ from ... import base_t
13
+ from ... import exports_t
14
+ from ... import identifier_t
15
+
16
+ __all__: list[str] = [
17
+ "Arguments",
18
+ "Data",
19
+ "ENDPOINT_METHOD",
20
+ "ENDPOINT_PATH",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "POST"
24
+ ENDPOINT_PATH = "api/external/entity/export_entities"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.entity.export_entities.Arguments",
30
+ )
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
+ class Arguments:
33
+ config_key: identifier_t.IdentifierKey
34
+ type: exports_t.ExportType = exports_t.ExportType.EXCEL
35
+ client_timezone: exports_t.ListingExportUserTimezone | None = None
36
+ limit: int | None = None
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @serial_class(
41
+ named_type_path="sdk.api.entity.export_entities.Data",
42
+ )
43
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
+ class Data(async_batch_t.AsyncBatchActionReturn):
45
+ pass
46
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,44 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
12
+ from ... import base_t
13
+ from ... import identifier_t
14
+ from ... import recipe_workflow_steps_t
15
+
16
+ __all__: list[str] = [
17
+ "Arguments",
18
+ "Data",
19
+ "ENDPOINT_METHOD",
20
+ "ENDPOINT_PATH",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "POST"
24
+ ENDPOINT_PATH = "api/external/recipes/create_mix_order"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.create_mix_order.Arguments",
30
+ )
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
+ class Arguments:
33
+ recipe_key: identifier_t.IdentifierKey
34
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier
35
+
36
+
37
+ # DO NOT MODIFY -- This file is generated by type_spec
38
+ @serial_class(
39
+ named_type_path="sdk.api.recipes.create_mix_order.Data",
40
+ )
41
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
42
+ class Data(async_batch_t.AsyncBatchActionReturn):
43
+ pass
44
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -60,7 +60,8 @@ class RecipeOutputValue:
60
60
  value_numeric: Decimal | None = None
61
61
  value_str: str | None = None
62
62
  value_curve: CurveValues | None = None
63
- value_color: data_t.RecipeOutputColor | None = None
63
+ value_color: data_t.SupportedColorFormatColor | None = None
64
+ value_ingredient_id: base_t.ObjectId | None = None
64
65
  formatting: recipes_t.RecipeAttributeFormatting | None = None
65
66
  field_values: list[field_values_t.ArgumentValueRefName | field_values_t.ArgumentValueId] | None = None
66
67
 
@@ -14,6 +14,7 @@ from uncountable.types import async_batch_t
14
14
  from uncountable.types import base_t
15
15
  import uncountable.types.api.recipes.clear_recipe_outputs as clear_recipe_outputs_t
16
16
  import uncountable.types.api.runsheet.complete_async_upload as complete_async_upload_t
17
+ import uncountable.types.api.recipes.create_mix_order as create_mix_order_t
17
18
  import uncountable.types.api.entity.create_or_update_entity as create_or_update_entity_t
18
19
  import uncountable.types.api.recipes.create_recipe as create_recipe_t
19
20
  import uncountable.types.api.recipes.edit_recipe_inputs as edit_recipe_inputs_t
@@ -217,6 +218,39 @@ class AsyncBatchProcessorBase(ABC):
217
218
  batch_reference=req.batch_reference,
218
219
  )
219
220
 
221
+ def create_mix_order(
222
+ self,
223
+ *,
224
+ recipe_key: identifier_t.IdentifierKey,
225
+ recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifier,
226
+ depends_on: list[str] | None = None,
227
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
228
+ """Creates mix order on a recipe workflow step
229
+
230
+ :param depends_on: A list of batch reference keys to process before processing this request
231
+ """
232
+ args = create_mix_order_t.Arguments(
233
+ recipe_key=recipe_key,
234
+ recipe_workflow_step_identifier=recipe_workflow_step_identifier,
235
+ )
236
+ json_data = serialize_for_api(args)
237
+
238
+ batch_reference = str(uuid.uuid4())
239
+
240
+ req = async_batch_t.AsyncBatchRequest(
241
+ path=async_batch_t.AsyncBatchRequestPath.CREATE_MIX_ORDER,
242
+ data=json_data,
243
+ depends_on=depends_on,
244
+ batch_reference=batch_reference,
245
+ )
246
+
247
+ self._enqueue(req)
248
+
249
+ return async_batch_t.QueuedAsyncBatchRequest(
250
+ path=req.path,
251
+ batch_reference=req.batch_reference,
252
+ )
253
+
220
254
  def create_or_update_entity(
221
255
  self,
222
256
  *,
@@ -44,6 +44,7 @@ class AsyncBatchRequestPath(StrEnum):
44
44
  CREATE_RECIPE_LINK = "recipe_links/create_recipe_link"
45
45
  UPSERT_CONDITION_MATCH = "condition_parameters/upsert_condition_match"
46
46
  COMPLETE_ASYNC_UPLOAD = "runsheet/complete_async_upload"
47
+ CREATE_MIX_ORDER = "recipes/create_mix_order"
47
48
 
48
49
 
49
50
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -74,16 +74,13 @@ def is_pure_json_value(value: ExtJsonValue) -> bool:
74
74
  return True
75
75
 
76
76
  if isinstance(value, list):
77
- for item in value:
78
- if not is_pure_json_value(item):
79
- return False
80
- return True
77
+ return all(is_pure_json_value(item) for item in value)
81
78
 
82
79
  if isinstance(value, dict):
83
- for key, item in value.items():
84
- if not is_pure_json_value(key) or not is_pure_json_value(item):
85
- return False
86
- return True
80
+ return all(
81
+ is_pure_json_value(key) and is_pure_json_value(item)
82
+ for key, item in value.items()
83
+ )
87
84
 
88
85
  return False
89
86
  # === END section from base.prepart.py ===
uncountable/types/data.py CHANGED
@@ -3,10 +3,10 @@
3
3
  # isort: skip_file
4
4
  # DO NOT MODIFY -- This file is generated by type_spec
5
5
  # Kept only for SDK backwards compatibility
6
+ from .data_t import ColorFormat as ColorFormat
6
7
  from .data_t import RgbColor as RgbColor
7
8
  from .data_t import CielabColor as CielabColor
8
9
  from .data_t import XyzColor as XyzColor
9
10
  from .data_t import LChColor as LChColor
10
- from .data_t import HslColor as HslColor
11
- from .data_t import RecipeOutputColor as RecipeOutputColor
11
+ from .data_t import SupportedColorFormatColor as SupportedColorFormatColor
12
12
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -6,27 +6,39 @@ from __future__ import annotations
6
6
  import typing # noqa: F401
7
7
  import datetime # noqa: F401
8
8
  from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
9
10
  import dataclasses
10
11
  from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_union_annotation
11
13
  from . import base_t
12
14
 
13
15
  __all__: list[str] = [
14
16
  "CielabColor",
15
- "HslColor",
17
+ "ColorFormat",
16
18
  "LChColor",
17
- "RecipeOutputColor",
18
19
  "RgbColor",
20
+ "SupportedColorFormatColor",
19
21
  "XyzColor",
20
22
  ]
21
23
 
22
24
 
25
+ # DO NOT MODIFY -- This file is generated by type_spec
26
+ class ColorFormat(StrEnum):
27
+ RGB = "rgb"
28
+ LAB = "lab"
29
+ XYZ = "xyz"
30
+ LCH = "lch"
31
+
32
+
23
33
  # DO NOT MODIFY -- This file is generated by type_spec
24
34
  @serial_class(
25
35
  named_type_path="sdk.data.RgbColor",
26
- unconverted_keys={"B", "G", "R"},
36
+ unconverted_keys={"B", "G", "R", "type"},
37
+ parse_require={"type"},
27
38
  )
28
39
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
29
40
  class RgbColor:
41
+ type: typing.Literal[ColorFormat.RGB] = ColorFormat.RGB
30
42
  R: Decimal
31
43
  G: Decimal
32
44
  B: Decimal
@@ -35,10 +47,12 @@ class RgbColor:
35
47
  # DO NOT MODIFY -- This file is generated by type_spec
36
48
  @serial_class(
37
49
  named_type_path="sdk.data.CielabColor",
38
- unconverted_keys={"L", "a", "b"},
50
+ unconverted_keys={"L", "a", "b", "type"},
51
+ parse_require={"type"},
39
52
  )
40
53
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
54
  class CielabColor:
55
+ type: typing.Literal[ColorFormat.LAB] = ColorFormat.LAB
42
56
  L: Decimal
43
57
  a: Decimal
44
58
  b: Decimal
@@ -47,10 +61,12 @@ class CielabColor:
47
61
  # DO NOT MODIFY -- This file is generated by type_spec
48
62
  @serial_class(
49
63
  named_type_path="sdk.data.XyzColor",
50
- unconverted_keys={"X", "Y", "Z"},
64
+ unconverted_keys={"X", "Y", "Z", "type"},
65
+ parse_require={"type"},
51
66
  )
52
67
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
53
68
  class XyzColor:
69
+ type: typing.Literal[ColorFormat.XYZ] = ColorFormat.XYZ
54
70
  X: Decimal
55
71
  Y: Decimal
56
72
  Z: Decimal
@@ -59,36 +75,29 @@ class XyzColor:
59
75
  # DO NOT MODIFY -- This file is generated by type_spec
60
76
  @serial_class(
61
77
  named_type_path="sdk.data.LChColor",
62
- unconverted_keys={"C", "L", "h"},
78
+ unconverted_keys={"C", "L", "h", "type"},
79
+ parse_require={"type"},
63
80
  )
64
81
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
65
82
  class LChColor:
83
+ type: typing.Literal[ColorFormat.LCH] = ColorFormat.LCH
66
84
  L: Decimal
67
85
  C: Decimal
68
86
  h: Decimal
69
87
 
70
88
 
71
89
  # DO NOT MODIFY -- This file is generated by type_spec
72
- @serial_class(
73
- named_type_path="sdk.data.HslColor",
74
- unconverted_keys={"L", "h", "s"},
75
- )
76
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
77
- class HslColor:
78
- h: Decimal
79
- s: Decimal
80
- L: Decimal
81
-
82
-
83
- # DO NOT MODIFY -- This file is generated by type_spec
84
- @serial_class(
85
- named_type_path="sdk.data.RecipeOutputColor",
86
- unconverted_keys={"CIELAB", "LCH", "RGB", "XYZ"},
87
- )
88
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
89
- class RecipeOutputColor:
90
- RGB: RgbColor
91
- CIELAB: CielabColor
92
- XYZ: XyzColor | None = None
93
- LCH: LChColor | None = None
90
+ SupportedColorFormatColor = typing.Annotated[
91
+ RgbColor | CielabColor | XyzColor | LChColor,
92
+ serial_union_annotation(
93
+ named_type_path="sdk.data.SupportedColorFormatColor",
94
+ discriminator="type",
95
+ discriminator_map={
96
+ "rgb": RgbColor,
97
+ "lab": CielabColor,
98
+ "xyz": XyzColor,
99
+ "lch": LChColor,
100
+ },
101
+ ),
102
+ ]
94
103
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -390,7 +390,7 @@ class EntityType(StrEnum):
390
390
 
391
391
  # DO NOT MODIFY -- This file is generated by type_spec
392
392
  LimitedEntityType = typing.Annotated[
393
- typing.Literal[EntityType.LAB_REQUEST] | typing.Literal[EntityType.APPROVAL] | typing.Literal[EntityType.CUSTOM_ENTITY] | typing.Literal[EntityType.INGREDIENT_ATTRIBUTE] | typing.Literal[EntityType.INVENTORY_AMOUNT] | typing.Literal[EntityType.TASK] | typing.Literal[EntityType.PROJECT] | typing.Literal[EntityType.EQUIPMENT] | typing.Literal[EntityType.INV_LOCAL_LOCATIONS] | typing.Literal[EntityType.FIELD_OPTION_SET] | typing.Literal[EntityType.WEBHOOK] | typing.Literal[EntityType.SPECS] | typing.Literal[EntityType.GOAL] | typing.Literal[EntityType.INGREDIENT_TAG_MAP] | typing.Literal[EntityType.INGREDIENT_TAG] | typing.Literal[EntityType.CONDITION_PARAMETER] | typing.Literal[EntityType.OUTPUT] | typing.Literal[EntityType.OUTPUT_CONDITION_PARAMETER] | typing.Literal[EntityType.ASYNC_JOB] | typing.Literal[EntityType.CONSTRAINT] | typing.Literal[EntityType.INGREDIENT_CATEGORY_ALL] | typing.Literal[EntityType.TIME_SERIES_SEGMENT] | typing.Literal[EntityType.EQUIPMENT_MAINTENANCE] | typing.Literal[EntityType.MAINTENANCE_SCHEDULE] | typing.Literal[EntityType.CONDITION_PARAMETER_RULE] | typing.Literal[EntityType.INGREDIENT],
393
+ typing.Literal[EntityType.LAB_REQUEST] | typing.Literal[EntityType.APPROVAL] | typing.Literal[EntityType.CUSTOM_ENTITY] | typing.Literal[EntityType.INGREDIENT_ATTRIBUTE] | typing.Literal[EntityType.INVENTORY_AMOUNT] | typing.Literal[EntityType.TASK] | typing.Literal[EntityType.PROJECT] | typing.Literal[EntityType.EQUIPMENT] | typing.Literal[EntityType.INV_LOCAL_LOCATIONS] | typing.Literal[EntityType.FIELD_OPTION_SET] | typing.Literal[EntityType.WEBHOOK] | typing.Literal[EntityType.SPECS] | typing.Literal[EntityType.GOAL] | typing.Literal[EntityType.INGREDIENT_TAG_MAP] | typing.Literal[EntityType.INGREDIENT_TAG] | typing.Literal[EntityType.CONDITION_PARAMETER] | typing.Literal[EntityType.OUTPUT] | typing.Literal[EntityType.OUTPUT_CONDITION_PARAMETER] | typing.Literal[EntityType.ASYNC_JOB] | typing.Literal[EntityType.CONSTRAINT] | typing.Literal[EntityType.INGREDIENT_CATEGORY_ALL] | typing.Literal[EntityType.TIME_SERIES_SEGMENT] | typing.Literal[EntityType.EQUIPMENT_MAINTENANCE] | typing.Literal[EntityType.MAINTENANCE_SCHEDULE] | typing.Literal[EntityType.CONDITION_PARAMETER_RULE] | typing.Literal[EntityType.INGREDIENT] | typing.Literal[EntityType.TIMESHEET_ENTRY],
394
394
  serial_alias_annotation(
395
395
  named_type_path="sdk.entity.LimitedEntityType",
396
396
  ),
@@ -0,0 +1,8 @@
1
+ # ruff: noqa: E402 Q003
2
+ # fmt: off
3
+ # isort: skip_file
4
+ # DO NOT MODIFY -- This file is generated by type_spec
5
+ # Kept only for SDK backwards compatibility
6
+ from .exports_t import ListingExportUserTimezone as ListingExportUserTimezone
7
+ from .exports_t import ExportType as ExportType
8
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,33 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from . import base_t
13
+
14
+ __all__: list[str] = [
15
+ "ExportType",
16
+ "ListingExportUserTimezone",
17
+ ]
18
+
19
+
20
+ # DO NOT MODIFY -- This file is generated by type_spec
21
+ @serial_class(
22
+ named_type_path="sdk.exports.ListingExportUserTimezone",
23
+ )
24
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
25
+ class ListingExportUserTimezone:
26
+ timezone_name: str
27
+
28
+
29
+ # DO NOT MODIFY -- This file is generated by type_spec
30
+ class ExportType(StrEnum):
31
+ EXCEL = "excel"
32
+ PDF = "pdf"
33
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -187,6 +187,7 @@ class JobDefinitionBase:
187
187
  executor: JobExecutor
188
188
  enabled: bool = True
189
189
  logging_settings: JobLoggingSettings | None = None
190
+ subqueue_name: str | None = None
190
191
 
191
192
 
192
193
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.112
3
+ Version: 0.0.114
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -24,19 +24,20 @@ examples/set_recipe_metadata_file.py,sha256=cRVXGz4UN4aqnNrNSzyBmikYHpe63lMIuzOp
24
24
  examples/set_recipe_output_file_sdk.py,sha256=Lz1amqppnWTX83z-C090wCJ4hcKmCD3kb-4v0uBRi0Y,782
25
25
  examples/upload_files.py,sha256=qMaSvMSdTMPOOP55y1AwEurc0SOdZAMvEydlqJPsGpg,432
26
26
  examples/integration-server/pyproject.toml,sha256=i4Px7I__asDvP4WlAd2PncfRRQ-U4t5xp0tqT9YYs3s,9149
27
+ examples/integration-server/jobs/materials_auto/concurrent_cron.py,sha256=xsK3H9ZEaniedC2nJUB0rqOcFI8y-ojfl_nLSJb9AMM,312
27
28
  examples/integration-server/jobs/materials_auto/example_cron.py,sha256=7VVQ-UJsq3DbGpN3XPnorRVZYo-vCwbfSU3VVDluIzA,699
28
29
  examples/integration-server/jobs/materials_auto/example_runsheet_wh.py,sha256=_wILTnbzzLf9zrcQb_KQKytxxcya1ej6MqQnoUSS4fA,1180
29
30
  examples/integration-server/jobs/materials_auto/example_wh.py,sha256=PN-skP27yJwDZboWk5g5EZEc3AKfVayQLfnopjsDKJc,659
30
- examples/integration-server/jobs/materials_auto/profile.yaml,sha256=PWGJkAPl5sqO2NHWvpFCODF4vhNDNoueSFd4vm54iuo,1124
31
+ examples/integration-server/jobs/materials_auto/profile.yaml,sha256=T9Q4Oh-BVHCoxAIY_Po4TWeEQNrXJ-d9w8tr3voYkM0,1555
31
32
  pkgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
33
  pkgs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
34
  pkgs/argument_parser/__init__.py,sha256=VWUOOtJ-ueRF2lkIJzgQe4xhBKR9IPkgf9vY28nF35s,870
34
35
  pkgs/argument_parser/_is_enum.py,sha256=Gw6jJa8nBwYGqXwwCZbSnWL8Rvr5alkg5lSVAqXtOZM,257
35
36
  pkgs/argument_parser/_is_namedtuple.py,sha256=Rjc1bKanIPPogl3qG5JPBxglG1TqWYOo1nxxhBASQWY,265
36
- pkgs/argument_parser/argument_parser.py,sha256=0CLEx2ua6tN0QbxJ2asP7JnKjEJR_I62tF0_AILlKq8,20981
37
+ pkgs/argument_parser/argument_parser.py,sha256=Hlyb3-FXy8PFWtTIzkyatreJ9P0GSDaEEB1ZyW1pS0E,21155
37
38
  pkgs/argument_parser/case_convert.py,sha256=NuJLJUJRbyVb6_Slen4uqaStEHbcOS1d-hBBfDrrw-c,605
38
39
  pkgs/filesystem_utils/__init__.py,sha256=2a0d2rEPlEEYwhm3Wckny4VCp4ZS7JtYSXmwdwNCRjo,1332
39
- pkgs/filesystem_utils/_blob_session.py,sha256=CtoB7PIocuZo8vvFIS_Rc-YR6KwzFB0rHUVPKFEbRAI,4862
40
+ pkgs/filesystem_utils/_blob_session.py,sha256=4GicmwgGHVcqO8pOTu-EJakKMb1-IsxT9QnVi2D0oKU,5143
40
41
  pkgs/filesystem_utils/_gdrive_session.py,sha256=xelwsGfxhxKX0LFwOv9UJ3_jSHyhYyHiLH6EUXNZgHo,11059
41
42
  pkgs/filesystem_utils/_local_session.py,sha256=xFEYhAvNqrOYqwt4jrEYOuYkjJn0zclZhTelW_Q1-rw,2325
42
43
  pkgs/filesystem_utils/_s3_session.py,sha256=DdD6M90z1VyTiuRdTmjvBNJOEFHBPyEU8wGKRKwHvOU,4027
@@ -61,7 +62,7 @@ pkgs/strenum_compat/__init__.py,sha256=wXRFeNvBm8RU6dy1PFJ5sRLgUIEeH_DVR95Sv5qpG
61
62
  pkgs/strenum_compat/strenum_compat.py,sha256=uOUAgpYTjHs1MX8dG81jRlyTkt3KNbkV_25zp7xTX2s,36
62
63
  pkgs/type_spec/__init__.py,sha256=h5DmJTca4QVV10sZR1x0-MlkZfuGYDfapR3zHvXfzto,19
63
64
  pkgs/type_spec/__main__.py,sha256=5bJaX9Y_-FavP0qwzhk-z-V97UY7uaezJTa1zhO_HHQ,1048
64
- pkgs/type_spec/builder.py,sha256=x-VokuJFjFpty4tIFwL9SBj0JZiA6OrtsGsspL0uGeQ,53749
65
+ pkgs/type_spec/builder.py,sha256=XqkKO-GxV2DLS_iDN9tnQJfNcefz5yMAwyjnMog87jE,54049
65
66
  pkgs/type_spec/config.py,sha256=K6WebgeI3Saew0IEBcm1s2fauw_CyvH183emVrNoUXg,5327
66
67
  pkgs/type_spec/cross_output_links.py,sha256=bVNn0a4LMVTRLg_zjtiHnoTwdINHfftjWoH6tGdxhlk,3124
67
68
  pkgs/type_spec/emit_io_ts.py,sha256=CUvBs0boB_X-Kndh66yYcqFfq3oC_LGs8YffLkJ0ZXA,5707
@@ -71,20 +72,21 @@ pkgs/type_spec/emit_python.py,sha256=JCT_o6sPJRaAL1J-TlMT-RN8d4bzLcYJF2iwNTcGlBA
71
72
  pkgs/type_spec/emit_typescript.py,sha256=0HRzxlbIP91rzbVkAntF4TKZppoKcWsqnDLAIRc1bng,10927
72
73
  pkgs/type_spec/emit_typescript_util.py,sha256=pYhzRb-U-B5peWdfJDQ0i9kI80Ojf2wbfkvJutk9rTw,10975
73
74
  pkgs/type_spec/load_types.py,sha256=GndEKQtICCQi4oXsL6cZ9khm8lBB830e6hx0wML4dHs,4278
75
+ pkgs/type_spec/non_discriminated_union_exceptions.py,sha256=JB4WNDJWc3e9WMOabX4aTd0-6K7n1hctIW2lGf1bYts,612
74
76
  pkgs/type_spec/open_api_util.py,sha256=DYnlygaMIqDQtSuYpUpd5lpA9JG4JHd_-iGe-BY2lhw,7333
75
77
  pkgs/type_spec/test.py,sha256=4ueujBq-pEgnX3Z69HyPmD-bullFXmpixcpVzfOkhP4,489
76
78
  pkgs/type_spec/util.py,sha256=S_SGTJU192x-wIbngVUTvXhQENMbBfxluigLmnItGI8,4848
77
79
  pkgs/type_spec/actions_registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
80
  pkgs/type_spec/actions_registry/__main__.py,sha256=SRw6kIhHTW7W2wGijYq66JARzoc4KpPmbLqwvnETyTE,4277
79
81
  pkgs/type_spec/actions_registry/emit_typescript.py,sha256=W1lI36ITdJ7MBf37wlTB7H3X9Ljt217vIGMv4e3fxfY,5986
80
- pkgs/type_spec/parts/base.py.prepart,sha256=1FLtoEFn0AB_qLUGjb3WUMmSi5pJKAevOgLD1L1eGVI,2454
82
+ pkgs/type_spec/parts/base.py.prepart,sha256=Xy8my5ol_Iu0hpQpvgsmqGLkGcMsLSg-cgjm4Yp-QI4,2369
81
83
  pkgs/type_spec/parts/base.ts.prepart,sha256=2FJJvpg2olCcavxj0nbYWdwKl6KeScour2JjSvN42l8,1001
82
84
  pkgs/type_spec/type_info/__main__.py,sha256=TLNvCHGcmaj_8Sj5bAQNpuNaaw2dpDzoFDWZds0V4Qo,1002
83
85
  pkgs/type_spec/type_info/emit_type_info.py,sha256=xRjZiwDDii4Bq8yVfcgE8YFechoKAcGmYXBk3Dq-K-s,15387
84
86
  pkgs/type_spec/ui_entry_actions/__init__.py,sha256=WiHE_BexOEZWbkkbD7EnFau1aMLNmfgQywG9PTQNCkw,135
85
87
  pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py,sha256=iVjThgDpfkuqeq0LENaCRrrGkWQ6kMIhVa-yZWXSflM,8981
86
88
  pkgs/type_spec/value_spec/__init__.py,sha256=Z-grlcZtxAfEXhPHsK0nD7PFLGsv4eqvunaPN7_TA84,83
87
- pkgs/type_spec/value_spec/__main__.py,sha256=D1ofjeEs3qFpB_GUZR1rZbryc0nMEyWj54VyhI-RqpI,8875
89
+ pkgs/type_spec/value_spec/__main__.py,sha256=oM5lcV6Hv_03okjtfWn2fzSHsarFVa9ArU_g02XnQJw,8879
88
90
  pkgs/type_spec/value_spec/convert_type.py,sha256=OvP7dwUMHXNHVXWYT4jkaYJ96S3a2SnFuC_iMdYVB7s,2927
89
91
  pkgs/type_spec/value_spec/emit_python.py,sha256=YQCkc9nHYKkFbdqLOW3YT39wciunE58yDuzdXn2rW5Q,7214
90
92
  pkgs/type_spec/value_spec/types.py,sha256=Yc3LaKHN1G6wbgrBv0dpu5vijUXtS2GcDTusYPnDvK0,454
@@ -102,7 +104,7 @@ uncountable/integration/construct_client.py,sha256=I53mGcdS88hba3HFwgXmWQaTd1d5u
102
104
  uncountable/integration/cron.py,sha256=6eH-kIs3sdYPCyb62_L2M7U_uQTdMTdwY5hreEJb0hw,887
103
105
  uncountable/integration/entrypoint.py,sha256=BHOYPQgKvZE6HG8Rv15MkdYl8lRkvfDgv1OdLo0oQ9Q,433
104
106
  uncountable/integration/job.py,sha256=lRQhOfm8kRlUnT1BMQRMZ49n1IzOup5VRH0AiZ2AFo4,3214
105
- uncountable/integration/scan_profiles.py,sha256=760zbv7O7wXxHUHqUkFBpd1Afe8hqxMPU3ugwZGdhEo,2925
107
+ uncountable/integration/scan_profiles.py,sha256=RHBmPc5E10YZzf4cmglwrn2yAy0jHBhQ-P_GlAk2TeU,2919
106
108
  uncountable/integration/scheduler.py,sha256=t75ANJN21DElUFvEdtgueTluF7y17jTtBDDF8f3NRDM,4812
107
109
  uncountable/integration/server.py,sha256=m_DYRosGbHuPhygM32Xo-jRBl_oaUhOYsBBD1qwwKh4,4697
108
110
  uncountable/integration/telemetry.py,sha256=jeeycEnGcW0Fk-f7JI5d-k8Ih4FLoNBCxvSJlJ98wwU,7418
@@ -114,7 +116,7 @@ uncountable/integration/executors/executors.py,sha256=Kzisp1eKufGCWrHIw4mmAj-l1U
114
116
  uncountable/integration/executors/generic_upload_executor.py,sha256=z0HfvuBR1wUbRpMVxJQ5Jlzbdk8G7YmAGENmze85Tr8,12076
115
117
  uncountable/integration/executors/script_executor.py,sha256=BBQ9f0l7uH2hgKf60jtm-pONzwk-EeOhM2qBAbv_URo,846
116
118
  uncountable/integration/queue_runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
- uncountable/integration/queue_runner/job_scheduler.py,sha256=2acmeWscG87MZsifxwMRMGJ4sQgQVNJNr5CqIPUg75E,6288
119
+ uncountable/integration/queue_runner/job_scheduler.py,sha256=lLP3R8RVE_4CJ9D-AsJSsZVciKCISsvgUMRs4tIZZpE,6557
118
120
  uncountable/integration/queue_runner/queue_runner.py,sha256=0BmYu5zHdothTevGsB-nXg6MBd1UD-WkP3h1WCKMdQg,710
119
121
  uncountable/integration/queue_runner/types.py,sha256=8qTq29BTSa5rmW6CBlBntP0pNIiDcwu1wHa78pjroS0,219
120
122
  uncountable/integration/queue_runner/worker.py,sha256=WwJmwHkgovfiqrMeNJVtIyDYJAib5ajog5ag2l_AquI,4584
@@ -132,18 +134,18 @@ uncountable/integration/queue_runner/datastore/datastore_sqlite.py,sha256=OdE4gS
132
134
  uncountable/integration/queue_runner/datastore/interface.py,sha256=j4D-zVvLq-48VTVwHVei82UVUJ_P3cxiseyiTl0MoNw,534
133
135
  uncountable/integration/queue_runner/datastore/model.py,sha256=8-RI5A2yPZVGBLWINVmMd6VOl_oHtqGtnaNXcapAChw,577
134
136
  uncountable/integration/secret_retrieval/__init__.py,sha256=3QXVj35w8rRMxVvmmsViFYDi3lcb3g70incfalOEm6o,87
135
- uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=9iz9N8Z-B68QwFCXsx8hTYbgDbk06ejkJ3RQ9mCLMyM,3000
137
+ uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=LBEf18KHtXZxg-ZZ80stJ1vW39AWf0CQllP6pNu3Eq8,2994
136
138
  uncountable/integration/webhook_server/entrypoint.py,sha256=yQWQq_k3kbJkSsEEt6k22YwhXekezJZfV0rnn-hP-Yo,5516
137
- uncountable/types/__init__.py,sha256=199fdKdrfJRLLa-fZEkXM0ohyKrSMOXRiW0aYu_KsM4,9760
139
+ uncountable/types/__init__.py,sha256=eqeDMCXTr9Mwo10RSGMa4znfu_7TVp_0gYJxPKmLCfQ,9990
138
140
  uncountable/types/async_batch.py,sha256=yCCWrrLQfxXVqZp-KskxLBNkNmuELdz4PJjx8ULppgs,662
139
- uncountable/types/async_batch_processor.py,sha256=k-5LfC9rvuONkAUs657jPWNxSQrVHoJyloTZcsHciuY,20571
140
- uncountable/types/async_batch_t.py,sha256=weicBkHBQ5tYQtwUP5YRd7ZLo0Iap7-NKwlz4e6U4oU,3729
141
+ uncountable/types/async_batch_processor.py,sha256=Y8rp-GtuhwUBg18yb5T7bQpb48vsQpACGrvaIiFYLrU,21765
142
+ uncountable/types/async_batch_t.py,sha256=JuswurXlYW38MfAXJ0UWb7hE2rmzFaHBAsNhRYAyMD4,3779
141
143
  uncountable/types/async_jobs.py,sha256=JI0ScfawaqMRbJ2jbgW3YQLhijPnBeYdMnZJjygSxHg,322
142
144
  uncountable/types/async_jobs_t.py,sha256=u4xd3i512PZ-9592Q2ZgWh_faMiI4UMm0F_gOmZnerI,1389
143
145
  uncountable/types/auth_retrieval.py,sha256=770zjN1K9EF5zs1Xml7x6ke6Hkze7rcMT5FdDVCIl9M,549
144
146
  uncountable/types/auth_retrieval_t.py,sha256=iMUC_H7qYivtAr4anDD0dBwIB1hXhr7JKEZ2peP-juM,2376
145
147
  uncountable/types/base.py,sha256=10-34wiyxrOZr2RQNiBohDNWc7b2i_La_yMuKLYslcU,338
146
- uncountable/types/base_t.py,sha256=2991awgqj-Ck09fyhS46BRxMkswDTzxpzJTwJmNYJuU,2973
148
+ uncountable/types/base_t.py,sha256=dMsFNXPcQtu7dawJfH-vbUFhN9mCelZN1ccaE0TAkBY,2888
147
149
  uncountable/types/calculations.py,sha256=fApOFpgBemt_t7IVneVR0VdI3X5EOxiG6Xhzr6RR8Gw,263
148
150
  uncountable/types/calculations_t.py,sha256=pl-lhjyDQuj11Sf9g1-0BsSkN7Ez8UxDp8-KMQ_3enM,709
149
151
  uncountable/types/chemical_structure.py,sha256=ujyragaD26-QG5jgKnWhO7TN3N1V9b_04T2WhqNYxxo,281
@@ -153,12 +155,14 @@ uncountable/types/client_config.py,sha256=qLpHt4O_B098CyN6qQajoxZ2zjZ1DILXLUEGyy
153
155
  uncountable/types/client_config_t.py,sha256=yTFIYAitMrcc4oV9J-HADODS_Hwi45z-piz7rr7QT04,781
154
156
  uncountable/types/curves.py,sha256=QyEyC20jsG-LGKVx6miiF-w70vKMwNkILFBDIJ5Ok9g,345
155
157
  uncountable/types/curves_t.py,sha256=DxYepdC3QKKR7mepOOBoyarNcFZQdUa5ZYH-hwCY3BI,1469
156
- uncountable/types/data.py,sha256=6dChU1uzwHT8xN2AFbMaAW41RV53b1_hLWuGny4EiMA,478
157
- uncountable/types/data_t.py,sha256=FFT06yO2G0ktRXCpgcZQspmUQGx5J8fm1Hjsm4_sp-w,2490
158
+ uncountable/types/data.py,sha256=u2isf4XEug3Eu-xSIoqGaCQmW2dFaKBHCkP_WKYwwBc,500
159
+ uncountable/types/data_t.py,sha256=vFoypK_WMGfN28r1sSlDYHZNUdBQC0XCN7-_Mlo4FJk,2832
158
160
  uncountable/types/entity.py,sha256=Zclk1LYcRaYrMDhqyCjMSLEg0fE6_q8LHvV22Qvscgs,566
159
- uncountable/types/entity_t.py,sha256=XMxUpBmUVx8poTsKjbYmJZIAtcO_hR4cOmutmDRtrfA,20121
161
+ uncountable/types/entity_t.py,sha256=tyRdNrRCcWRyOO_dXEUa6G7KTHLCMJWBueK5cIBSx34,20166
160
162
  uncountable/types/experiment_groups.py,sha256=qUpFOx1AKgzaT_4khCOv5Xs6jwiQGbvHH-GUh3v1nv4,288
161
163
  uncountable/types/experiment_groups_t.py,sha256=29Ct-WPejpYMuGfnFfOoosU9iSfjzxpabpBX6oTPFUA,761
164
+ uncountable/types/exports.py,sha256=VMmxUO2PpV1Y63hZ2AnVor4H-B6aswJ7YpSru_u89lU,334
165
+ uncountable/types/exports_t.py,sha256=der2gk1YL5XjWTrqsLD2KNynXA_z7IzmvphOfvGT19M,894
162
166
  uncountable/types/field_values.py,sha256=iG4TvITLnlz023GuhFrlDwXB7oov5DPpAs_FBaMaJR8,1713
163
167
  uncountable/types/field_values_t.py,sha256=Br2D2dibU9avbomfkaXHXw1ineUcIkATBbEm0eZm1SE,10076
164
168
  uncountable/types/fields.py,sha256=M0_ZZr0QdNLXkdHAGo5mfU90kEtHedCSKrcod-FG30Y,245
@@ -176,7 +180,7 @@ uncountable/types/inputs_t.py,sha256=eSVA7LNgLI3ja83GJm4sA9KhPICVV4zj2Dd4OhbuY9g
176
180
  uncountable/types/integration_server.py,sha256=VonA8h8TGnVBiss5W8-K82lA01JQa7TLk0ubFo8iiBQ,364
177
181
  uncountable/types/integration_server_t.py,sha256=QAwAB-rlfYh14ZzfVUQd-Bfky3LkPcsSEBhRH3UGvZE,1270
178
182
  uncountable/types/job_definition.py,sha256=6BkLZrmTfIYh45XFGZ5HOYveued0YXvl17YTlXblXjw,1646
179
- uncountable/types/job_definition_t.py,sha256=u47lf7gCfb6h_k5ByZC7kTxlBnTyTSRGhUTbjPiAu_c,8651
183
+ uncountable/types/job_definition_t.py,sha256=6ZJ9rlqXwbOB-G_U8YoWUDPvPak6_11kV2qT2jx8t9Q,8688
180
184
  uncountable/types/outputs.py,sha256=I6zP2WHXg_jXgMqmuEJuJOlsjKjQGHjfs1JOwW9YxBM,260
181
185
  uncountable/types/outputs_t.py,sha256=atsOkBBgnMeCgPaKPidk9eNouWVnynSrMI_ZbqxRJeY,795
182
186
  uncountable/types/overrides.py,sha256=fOvj8P9K9ul8fnTwA--l140EWHuc1BFq8tXgtBkYld4,410
@@ -229,6 +233,7 @@ uncountable/types/api/entity/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8A
229
233
  uncountable/types/api/entity/create_entities.py,sha256=cCDEra2SHvGWvz7nIxxMDSQN6OWrHMTT0JSomWUesto,1794
230
234
  uncountable/types/api/entity/create_entity.py,sha256=urT6C7iGAa7_rCv9Wcz6GM_lKg1tP55E__rjNkj-Rjc,1879
231
235
  uncountable/types/api/entity/create_or_update_entity.py,sha256=OK05B9nqlxsCU41iVCI_Nn66qVeQfqgdf2oZn7kUPFM,1445
236
+ uncountable/types/api/entity/export_entities.py,sha256=zz_4P6bQAt7gU2o2to9zUh0HHLQKaxLkbFGfbgY3KVk,1395
232
237
  uncountable/types/api/entity/get_entities_data.py,sha256=hu0UfkU4PTyv3_CBZ7YmR8L8BKMq8hx6zH43XtUm16E,1616
233
238
  uncountable/types/api/entity/grant_entity_permissions.py,sha256=4CvVIMvpdok8K1Bh6wMlwuUmoeP_-nL9y2GCEM6uAhY,1536
234
239
  uncountable/types/api/entity/list_entities.py,sha256=LLc_QRH2LI7qPamxwF8DAPJCnfDo1Nw_0VGNDl6CMXI,2139
@@ -282,6 +287,7 @@ uncountable/types/api/recipes/archive_recipes.py,sha256=SKXcTkfY7CiaLVumt5BzjNvx
282
287
  uncountable/types/api/recipes/associate_recipe_as_input.py,sha256=vXtdffaWJGvK1rrFA_fRGf2qfstt_tuds8ZFBJcRfwM,1339
283
288
  uncountable/types/api/recipes/associate_recipe_as_lot.py,sha256=SBfeNGn6TF2Fawemc1hkJkElWrxD89jvZiQvCnTawBs,1283
284
289
  uncountable/types/api/recipes/clear_recipe_outputs.py,sha256=IOHeOl7eO5Arzpfgjhk3y5eWY1lWb6xSzOrIC4uH78w,1227
290
+ uncountable/types/api/recipes/create_mix_order.py,sha256=LMLTw5malVnHsegFsKW04SBHJFDIJheh_qQClRFRsPM,1345
285
291
  uncountable/types/api/recipes/create_recipe.py,sha256=ESgjPKKQLPLZUOqn20LpYupxYyKl8g52RE25TC-Gjx4,1594
286
292
  uncountable/types/api/recipes/create_recipes.py,sha256=vSBCmHWdXDGacNXiRgK22G_nei8SHK1kwSJRRBQnaPU,2106
287
293
  uncountable/types/api/recipes/disassociate_recipe_as_input.py,sha256=Lka3041BI6nXYIzKFjvKs_E9XO67ioHuFg8bEB85GCM,1251
@@ -299,7 +305,7 @@ uncountable/types/api/recipes/set_recipe_inputs.py,sha256=GSuT-Vgrn8-OG_eFuPCElI
299
305
  uncountable/types/api/recipes/set_recipe_metadata.py,sha256=lrMB_wyOKjTLl9fiKT30M2HBU7lPwjtDsqZY8ODA-oA,1249
300
306
  uncountable/types/api/recipes/set_recipe_output_annotations.py,sha256=OEMKfY_CEpsSa1xZXsM2ncUOV7acbZTMZYXiLjzJlfQ,3892
301
307
  uncountable/types/api/recipes/set_recipe_output_file.py,sha256=2q63zD5-JEfWk5AffNHwERjzn8MzfQCtgGTKZQhcwsU,1685
302
- uncountable/types/api/recipes/set_recipe_outputs.py,sha256=vz-HaZ2HRUWS76LrFBsTm2JB6S3oWaxJMXyRbISSO48,2689
308
+ uncountable/types/api/recipes/set_recipe_outputs.py,sha256=ENIP8T1rUZpuI4iPrrGpwZInPNdB6m1ZIyEIbyobkj4,2752
303
309
  uncountable/types/api/recipes/set_recipe_tags.py,sha256=C4GzlHVfTDUA2CrgDqfYrDpS9jgOBf9bIgu4iqGvdno,3464
304
310
  uncountable/types/api/recipes/unarchive_recipes.py,sha256=ke3JPaj6hRdTjP-Qot8Gc-_ptTYqC_1ZF3kKbPJ0H88,1145
305
311
  uncountable/types/api/recipes/unlock_recipes.py,sha256=bwFFsgeozIMuyR9XmeUK1s3RuH1R8jRsFiF8SUKxBAg,1403
@@ -309,7 +315,7 @@ uncountable/types/api/triggers/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr
309
315
  uncountable/types/api/triggers/run_trigger.py,sha256=dgDX_sRWSJ36UuzMZhG25oHV1HIOUKYY2G3fjKugZrw,1204
310
316
  uncountable/types/api/uploader/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
311
317
  uncountable/types/api/uploader/invoke_uploader.py,sha256=Bj7Dq4A90k00suacwk3bLA_dCb2aovS1kAbVam2AQnM,1395
312
- uncountablepythonsdk-0.0.112.dist-info/METADATA,sha256=e5f_u4xbREmo4_YvzS8tPTMK2kwcWs5l1MLch4aSZ3E,2143
313
- uncountablepythonsdk-0.0.112.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
314
- uncountablepythonsdk-0.0.112.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
315
- uncountablepythonsdk-0.0.112.dist-info/RECORD,,
318
+ uncountablepythonsdk-0.0.114.dist-info/METADATA,sha256=58rVRRIi9Ru8HTpgr8TOE5xNOxwkKfkDlbM7-i1Ptd8,2143
319
+ uncountablepythonsdk-0.0.114.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
320
+ uncountablepythonsdk-0.0.114.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
321
+ uncountablepythonsdk-0.0.114.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5