UncountablePythonSDK 0.0.113__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.

@@ -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],
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
 
@@ -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
@@ -61,6 +61,7 @@ class RecipeOutputValue:
61
61
  value_str: str | None = None
62
62
  value_curve: CurveValues | None = None
63
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 ===
@@ -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.113
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,16 +24,17 @@ 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
40
  pkgs/filesystem_utils/_blob_session.py,sha256=4GicmwgGHVcqO8pOTu-EJakKMb1-IsxT9QnVi2D0oKU,5143
@@ -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
@@ -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
@@ -134,16 +136,16 @@ uncountable/integration/queue_runner/datastore/model.py,sha256=8-RI5A2yPZVGBLWIN
134
136
  uncountable/integration/secret_retrieval/__init__.py,sha256=3QXVj35w8rRMxVvmmsViFYDi3lcb3g70incfalOEm6o,87
135
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
@@ -156,9 +158,11 @@ uncountable/types/curves_t.py,sha256=DxYepdC3QKKR7mepOOBoyarNcFZQdUa5ZYH-hwCY3BI
156
158
  uncountable/types/data.py,sha256=u2isf4XEug3Eu-xSIoqGaCQmW2dFaKBHCkP_WKYwwBc,500
157
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=L1AHz1-seHIWmQ8zpZ4J3p9FrN7zXfSOGbT5YEkuEE8,2697
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.113.dist-info/METADATA,sha256=9c3i5y6Lt9K-BN75Eya66-OGE1GXI59cpaQRlShbDVU,2143
313
- uncountablepythonsdk-0.0.113.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
314
- uncountablepythonsdk-0.0.113.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
315
- uncountablepythonsdk-0.0.113.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.4.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5