UncountablePythonSDK 0.0.103__py3-none-any.whl → 0.0.105__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 (31) hide show
  1. docs/requirements.txt +1 -1
  2. examples/integration-server/jobs/materials_auto/example_wh.py +17 -9
  3. pkgs/argument_parser/argument_parser.py +44 -9
  4. pkgs/serialization/serial_class.py +11 -0
  5. pkgs/type_spec/builder.py +7 -1
  6. pkgs/type_spec/emit_python.py +8 -0
  7. pkgs/type_spec/value_spec/__main__.py +7 -0
  8. pkgs/type_spec/value_spec/emit_python.py +2 -0
  9. uncountable/integration/job.py +6 -0
  10. uncountable/types/api/entity/lookup_entity.py +3 -0
  11. uncountable/types/api/recipes/add_time_series_data.py +1 -0
  12. uncountable/types/api/recipes/edit_recipe_inputs.py +2 -0
  13. uncountable/types/api/recipes/get_recipe_links.py +1 -0
  14. uncountable/types/api/recipes/lock_recipes.py +1 -0
  15. uncountable/types/api/recipes/set_recipe_outputs.py +1 -0
  16. uncountable/types/api/recipes/unlock_recipes.py +1 -0
  17. uncountable/types/client_base.py +21 -0
  18. uncountable/types/client_config_t.py +1 -0
  19. uncountable/types/entity_t.py +53 -19
  20. uncountable/types/field_values.py +2 -0
  21. uncountable/types/field_values_t.py +28 -1
  22. uncountable/types/generic_upload_t.py +1 -0
  23. uncountable/types/job_definition_t.py +2 -0
  24. uncountable/types/recipe_workflow_steps_t.py +1 -0
  25. uncountable/types/response_t.py +1 -0
  26. uncountable/types/webhook_job.py +1 -0
  27. uncountable/types/webhook_job_t.py +11 -0
  28. {uncountablepythonsdk-0.0.103.dist-info → uncountablepythonsdk-0.0.105.dist-info}/METADATA +1 -1
  29. {uncountablepythonsdk-0.0.103.dist-info → uncountablepythonsdk-0.0.105.dist-info}/RECORD +31 -31
  30. {uncountablepythonsdk-0.0.103.dist-info → uncountablepythonsdk-0.0.105.dist-info}/WHEEL +1 -1
  31. {uncountablepythonsdk-0.0.103.dist-info → uncountablepythonsdk-0.0.105.dist-info}/top_level.txt +0 -0
docs/requirements.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  furo==2024.8.6
2
2
  myst-parser==4.0.0
3
- sphinx-autoapi==3.4.0
3
+ sphinx-autoapi==3.5.0
4
4
  sphinx-copybutton==0.5.2
5
5
  Sphinx==8.1.3
6
6
  sphinx_design==0.6.1
@@ -1,15 +1,23 @@
1
- import typing
1
+ from dataclasses import dataclass
2
2
 
3
3
  from uncountable.integration.job import JobArguments, WebhookJob, register_job
4
- from uncountable.types.job_definition_t import JobResult
4
+ from uncountable.types import job_definition_t
5
5
 
6
6
 
7
- @register_job
8
- class WebhookExample(WebhookJob):
9
- @property
10
- def payload_type(self) -> typing.Any:
11
- return super().payload_type
7
+ @dataclass(kw_only=True)
8
+ class ExampleWebhookPayload:
9
+ id: int
10
+ message: str
11
+
12
12
 
13
- def run(self, args: JobArguments, payload: typing.Any) -> JobResult:
13
+ @register_job
14
+ class WebhookExample(WebhookJob[ExampleWebhookPayload]):
15
+ def run(
16
+ self, args: JobArguments, payload: ExampleWebhookPayload
17
+ ) -> job_definition_t.JobResult:
14
18
  args.logger.log_info(f"webhook invoked with payload: {payload}")
15
- return JobResult(success=True)
19
+ return job_definition_t.JobResult(success=True)
20
+
21
+ @property
22
+ def webhook_payload_type(self) -> type:
23
+ return ExampleWebhookPayload
@@ -58,7 +58,9 @@ class ParserOptions:
58
58
  return self.encoding == SourceEncoding.API
59
59
 
60
60
  @property
61
- def allow_direct_dataclass(self) -> bool:
61
+ def allow_direct_type(self) -> bool:
62
+ """This allows parsing from a DB column without having to check whether it's
63
+ the native format of the type, a JSON column, or a string encoding."""
62
64
  return self.encoding == SourceEncoding.STORAGE
63
65
 
64
66
 
@@ -97,6 +99,22 @@ def is_missing(field_type: typing.Any) -> bool:
97
99
  return not (len(args) == 0 or args[0] is not MissingSentryType)
98
100
 
99
101
 
102
+ def _has_field_default(field: dataclasses.Field[typing.Any]) -> bool:
103
+ return (
104
+ field.default != dataclasses.MISSING
105
+ and not isinstance(field.default, MissingSentryType)
106
+ ) or field.default_factory != dataclasses.MISSING
107
+
108
+
109
+ def _get_field_default(
110
+ field: dataclasses.Field[typing.Any],
111
+ ) -> typing.Any:
112
+ if field.default != dataclasses.MISSING:
113
+ return field.default
114
+ assert field.default_factory != dataclasses.MISSING
115
+ return field.default_factory()
116
+
117
+
100
118
  def _invoke_tuple_parsers[T](
101
119
  tuple_type: type[T],
102
120
  arg_parsers: typing.Sequence[typing.Callable[[typing.Any], object]],
@@ -155,7 +173,7 @@ def _build_parser_discriminated_union[T](
155
173
  discriminator_map: dict[str, ParserFunction[T]],
156
174
  ) -> ParserFunction[T]:
157
175
  def parse(value: typing.Any) -> typing.Any:
158
- if context.options.allow_direct_dataclass and dataclasses.is_dataclass(value):
176
+ if context.options.allow_direct_type and dataclasses.is_dataclass(value):
159
177
  discriminant = getattr(value, discriminator)
160
178
  else:
161
179
  discriminant = value.get(discriminator)
@@ -318,10 +336,22 @@ def _build_parser_inner[T](
318
336
  return parse_int
319
337
 
320
338
  if parsed_type is datetime:
321
- return lambda value: dateutil.parser.isoparse(value) # type:ignore
339
+
340
+ def parse_datetime(value: typing.Any) -> T:
341
+ if context.options.allow_direct_type and isinstance(value, datetime):
342
+ return value # type: ignore
343
+ return dateutil.parser.isoparse(value) # type:ignore
344
+
345
+ return parse_datetime
322
346
 
323
347
  if parsed_type is date:
324
- return lambda value: date.fromisoformat(value) # type:ignore
348
+
349
+ def parse_date(value: typing.Any) -> T:
350
+ if context.options.allow_direct_type and isinstance(value, date):
351
+ return value # type:ignore
352
+ return date.fromisoformat(value) # type:ignore
353
+
354
+ return parse_date
325
355
 
326
356
  # MyPy: It's unclear why `parsed_type in (str, OpaqueKey)` is flagged as invalid
327
357
  # Thus an or statement is used instead, which isn't flagged as invalid.
@@ -405,7 +435,7 @@ def _build_parser_dataclass[T](
405
435
 
406
436
  def parse(value: typing.Any) -> typing.Any:
407
437
  # Use an exact type match to prevent base/derived class mismatches
408
- if context.options.allow_direct_dataclass and type(value) is parsed_type:
438
+ if context.options.allow_direct_type and type(value) is parsed_type:
409
439
  return value
410
440
 
411
441
  data: dict[typing.Any, typing.Any] = {}
@@ -420,10 +450,8 @@ def _build_parser_dataclass[T](
420
450
  if field_raw_value == dataclasses.MISSING:
421
451
  if serial_class_data.has_parse_require(field.name):
422
452
  raise ValueError("missing-required-field", field.name)
423
- if field.default != dataclasses.MISSING:
424
- field_value = field.default
425
- elif field.default_factory != dataclasses.MISSING:
426
- field_value = field.default_factory()
453
+ if _has_field_default(field):
454
+ field_value = _get_field_default(field)
427
455
  elif is_missing(field_type):
428
456
  field_value = MissingSentryType()
429
457
  elif is_optional(field_type):
@@ -435,6 +463,13 @@ def _build_parser_dataclass[T](
435
463
  field_value = False
436
464
  else:
437
465
  raise ValueError("missing-value-for-field", field.name)
466
+ elif (
467
+ field_raw_value is None
468
+ and not is_optional(field_type)
469
+ and _has_field_default(field)
470
+ and not serial_class_data.has_parse_require(field.name)
471
+ ):
472
+ field_value = _get_field_default(field)
438
473
  elif serial_class_data.has_unconverted_value(field.name):
439
474
  field_value = field_raw_value
440
475
  else:
@@ -17,6 +17,7 @@ class _SerialClassData(SerialBase):
17
17
  to_string_values: set[str] = dataclasses.field(default_factory=set)
18
18
  parse_require: set[str] = dataclasses.field(default_factory=set)
19
19
  named_type_path: str | None = None
20
+ explicit_defaults: set[str] = dataclasses.field(default_factory=set)
20
21
 
21
22
 
22
23
  EMPTY_SERIAL_CLASS_DATA = _SerialClassData()
@@ -30,6 +31,7 @@ def serial_class(
30
31
  parse_require: set[str] | None = None,
31
32
  named_type_path: str | None = None,
32
33
  is_dynamic_allowed: bool = False,
34
+ explicit_defaults: set[str] | None = None,
33
35
  ) -> Callable[[ClassT], ClassT]:
34
36
  """
35
37
  An additional decorator to a dataclass that specifies serialization options.
@@ -52,6 +54,9 @@ def serial_class(
52
54
  requiring them for the API input.
53
55
  @param named_type_path
54
56
  The type_spec type-path to this type. This applies only to named types.
57
+ @param explicit_defaults
58
+ Fields that have explicit defaults in the definition. This is useful for
59
+ falling back onto these defaults when the field is mandatory but receives a null value.
55
60
  """
56
61
 
57
62
  def decorate(orig_class: ClassT) -> ClassT:
@@ -63,6 +68,7 @@ def serial_class(
63
68
  named_type_path=named_type_path,
64
69
  from_decorator=True,
65
70
  is_dynamic_allowed=is_dynamic_allowed,
71
+ explicit_defaults=explicit_defaults or set(),
66
72
  )
67
73
  return orig_class
68
74
 
@@ -90,6 +96,9 @@ class SerialClassDataInspector(SerialInspector[ClassT]):
90
96
  def has_parse_require(self, key: str) -> bool:
91
97
  return key in self.current.parse_require
92
98
 
99
+ def has_explicit_default(self, key: str) -> bool:
100
+ return key in self.current.explicit_defaults
101
+
93
102
 
94
103
  def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | None:
95
104
  base_class_data = (
@@ -115,6 +124,8 @@ def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | No
115
124
  | curr_base_class_data.to_string_values,
116
125
  parse_require=base_class_data.parse_require
117
126
  | curr_base_class_data.parse_require,
127
+ explicit_defaults=base_class_data.explicit_defaults
128
+ | curr_base_class_data.explicit_defaults,
118
129
  )
119
130
  return base_class_data
120
131
 
pkgs/type_spec/builder.py CHANGED
@@ -62,6 +62,7 @@ class SpecProperty:
62
62
  # Holds extra information that will be emitted along with type_info. The builder knows nothing
63
63
  # about the contents of this information.
64
64
  ext_info: Any = None
65
+ explicit_default: bool = False
65
66
 
66
67
 
67
68
  class NameCase(StrEnum):
@@ -389,6 +390,7 @@ class SpecTypeDefn(SpecType):
389
390
  ptype = builder.parse_type(self.namespace, data_type, scope=self)
390
391
 
391
392
  default_spec = data.get("default", MISSING)
393
+ explicit_default = default_spec != MISSING
392
394
  if default_spec == MISSING:
393
395
  has_default = False
394
396
  default = None
@@ -396,7 +398,10 @@ class SpecTypeDefn(SpecType):
396
398
  has_default = True
397
399
  # IMPROVE: check the type against the ptype
398
400
  default = default_spec
399
-
401
+ if extant == PropertyExtant.missing and explicit_default:
402
+ raise Exception(
403
+ f"cannot have extant missing and default for property {name}"
404
+ )
400
405
  parse_require = False
401
406
  literal = unwrap_literal_type(ptype)
402
407
  if literal is not None:
@@ -419,6 +424,7 @@ class SpecTypeDefn(SpecType):
419
424
  parse_require=parse_require,
420
425
  desc=data.get("desc", None),
421
426
  ext_info=ext_info,
427
+ explicit_default=explicit_default,
422
428
  )
423
429
  finally:
424
430
  builder.pop_where()
@@ -697,6 +697,7 @@ class EmittedPropertiesMetadata:
697
697
  unconverted_values: set[str]
698
698
  to_string_values: set[str]
699
699
  parse_require: set[str]
700
+ explicit_defaults: set[str]
700
701
 
701
702
 
702
703
  def _emit_type_properties(
@@ -728,6 +729,7 @@ def _emit_properties(
728
729
  unconverted_values: set[str] = set()
729
730
  to_string_values: set[str] = set()
730
731
  parse_require: set[str] = set()
732
+ explicit_defaults: set[str] = set()
731
733
 
732
734
  if len(properties) > 0:
733
735
 
@@ -748,6 +750,9 @@ def _emit_properties(
748
750
  if prop.parse_require:
749
751
  parse_require.add(py_name)
750
752
 
753
+ if prop.explicit_default:
754
+ explicit_defaults.add(py_name)
755
+
751
756
  ref_type = refer_to(ctx, stype)
752
757
  default = None
753
758
  if prop.extant == builder.PropertyExtant.missing:
@@ -791,6 +796,7 @@ def _emit_properties(
791
796
  unconverted_values=unconverted_values,
792
797
  to_string_values=to_string_values,
793
798
  parse_require=parse_require,
799
+ explicit_defaults=explicit_defaults,
794
800
  )
795
801
 
796
802
 
@@ -881,6 +887,7 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
881
887
  unconverted_values = emitted_properties_metadata.unconverted_values
882
888
  to_string_values = emitted_properties_metadata.to_string_values
883
889
  parse_require = emitted_properties_metadata.parse_require
890
+ explicit_defaults = emitted_properties_metadata.explicit_defaults
884
891
 
885
892
  _emit_generics(ctx, generics)
886
893
 
@@ -902,6 +909,7 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
902
909
  write_values("unconverted_values", unconverted_values)
903
910
  write_values("to_string_values", to_string_values)
904
911
  write_values("parse_require", parse_require)
912
+ write_values("explicit_defaults", explicit_defaults)
905
913
 
906
914
  ctx.out.write(")\n")
907
915
 
@@ -155,6 +155,7 @@ key_return = "return"
155
155
  key_description = "description"
156
156
  key_brief = "brief"
157
157
  key_name = "name"
158
+ key_draft = "draft"
158
159
 
159
160
 
160
161
  TypeT = TypeVar("TypeT")
@@ -229,6 +230,11 @@ def main() -> None:
229
230
 
230
231
  brief = get_as(spec, key_brief, str)
231
232
  description = get_as(spec, key_description, str)
233
+ draft = (
234
+ get_as(spec, key_draft, bool)
235
+ if spec.get(key_draft) is not None
236
+ else None
237
+ )
232
238
 
233
239
  return_value = get(spec, key_return)
234
240
  where.append("return")
@@ -245,6 +251,7 @@ def main() -> None:
245
251
  type=convert_to_value_spec_type(parsed.return_type_path),
246
252
  description=return_description,
247
253
  ),
254
+ draft=draft,
248
255
  )
249
256
  )
250
257
  where.pop()
@@ -164,6 +164,8 @@ def _emit_function(function: value_spec_t.Function, indent: str) -> str:
164
164
  f"{sub_indent}description={encode_common_string(function.description)},\n"
165
165
  )
166
166
  out.write(f"{sub_indent}brief={encode_common_string(function.brief)},\n")
167
+ if function.draft:
168
+ out.write(f"{sub_indent}draft={function.draft},\n")
167
169
  out.write(
168
170
  f"{sub_indent}return_value={_emit_function_return(function.return_value, sub_indent)},\n"
169
171
  )
@@ -85,3 +85,9 @@ class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
85
85
  def register_job(cls: type[Job]) -> type[Job]:
86
86
  cls._unc_job_registered = True
87
87
  return cls
88
+
89
+
90
+ class RunsheetWebhookJob(WebhookJob[webhook_job_t.RunsheetWebhookPayload]):
91
+ @property
92
+ def webhook_payload_type(self) -> type:
93
+ return webhook_job_t.RunsheetWebhookPayload
@@ -13,6 +13,7 @@ from pkgs.serialization import serial_union_annotation
13
13
  from ... import async_batch_t
14
14
  from ... import base_t
15
15
  from ... import entity_t
16
+ from ... import field_values_t
16
17
  from ... import identifier_t
17
18
 
18
19
  __all__: list[str] = [
@@ -49,11 +50,13 @@ class LookupEntityQueryBase:
49
50
  @serial_class(
50
51
  named_type_path="sdk.api.entity.lookup_entity.LookupFieldArgumentValue",
51
52
  unconverted_values={"field_value"},
53
+ explicit_defaults={"value_resolution"},
52
54
  )
53
55
  @dataclasses.dataclass(kw_only=True)
54
56
  class LookupFieldArgumentValue:
55
57
  field_key: identifier_t.IdentifierKey
56
58
  field_value: base_t.JsonValue
59
+ value_resolution: field_values_t.ValueResolution = field_values_t.ValueResolution.DIRECT
57
60
 
58
61
 
59
62
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -45,6 +45,7 @@ class TimeSeriesDatum:
45
45
  # DO NOT MODIFY -- This file is generated by type_spec
46
46
  @serial_class(
47
47
  named_type_path="sdk.api.recipes.add_time_series_data.Arguments",
48
+ explicit_defaults={"on_conflict"},
48
49
  )
49
50
  @dataclasses.dataclass(kw_only=True)
50
51
  class Arguments:
@@ -81,6 +81,7 @@ class RecipeInputEditClearInputs(RecipeInputEditBase):
81
81
  @serial_class(
82
82
  named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditInputBase",
83
83
  to_string_values={"value_numeric"},
84
+ explicit_defaults={"input_value_type", "quantity_basis"},
84
85
  )
85
86
  @dataclasses.dataclass(kw_only=True)
86
87
  class RecipeInputEditInputBase(RecipeInputEditBase):
@@ -196,6 +197,7 @@ class PlaceholderDisplayMode(StrEnum):
196
197
  # DO NOT MODIFY -- This file is generated by type_spec
197
198
  @serial_class(
198
199
  named_type_path="sdk.api.recipes.edit_recipe_inputs.PlaceholderBase",
200
+ explicit_defaults={"display_mode", "require_for_creation"},
199
201
  )
200
202
  @dataclasses.dataclass(kw_only=True)
201
203
  class PlaceholderBase:
@@ -25,6 +25,7 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipe_links"
25
25
  # DO NOT MODIFY -- This file is generated by type_spec
26
26
  @serial_class(
27
27
  named_type_path="sdk.api.recipes.get_recipe_links.Arguments",
28
+ explicit_defaults={"depth"},
28
29
  )
29
30
  @dataclasses.dataclass(kw_only=True)
30
31
  class Arguments:
@@ -42,6 +42,7 @@ class RecipeLockBase:
42
42
  # DO NOT MODIFY -- This file is generated by type_spec
43
43
  @serial_class(
44
44
  named_type_path="sdk.api.recipes.lock_recipes.Arguments",
45
+ explicit_defaults={"type"},
45
46
  )
46
47
  @dataclasses.dataclass(kw_only=True)
47
48
  class Arguments:
@@ -48,6 +48,7 @@ class NullBehavior(StrEnum):
48
48
  @serial_class(
49
49
  named_type_path="sdk.api.recipes.set_recipe_outputs.RecipeOutputValue",
50
50
  to_string_values={"value_numeric"},
51
+ explicit_defaults={"null_behavior"},
51
52
  )
52
53
  @dataclasses.dataclass(kw_only=True)
53
54
  class RecipeOutputValue:
@@ -31,6 +31,7 @@ class RecipeUnlockType(StrEnum):
31
31
  # DO NOT MODIFY -- This file is generated by type_spec
32
32
  @serial_class(
33
33
  named_type_path="sdk.api.recipes.unlock_recipes.Arguments",
34
+ explicit_defaults={"type"},
34
35
  )
35
36
  @dataclasses.dataclass(kw_only=True)
36
37
  class Arguments:
@@ -57,6 +57,7 @@ import uncountable.types.api.entity.list_entities as list_entities_t
57
57
  import uncountable.types.api.id_source.list_id_source as list_id_source_t
58
58
  import uncountable.types.api.entity.lock_entity as lock_entity_t
59
59
  import uncountable.types.api.recipes.lock_recipes as lock_recipes_t
60
+ import uncountable.types.api.entity.lookup_entity as lookup_entity_t
60
61
  import uncountable.types.api.id_source.match_id_source as match_id_source_t
61
62
  from uncountable.types import permissions_t
62
63
  from uncountable.types import post_base_t
@@ -1127,6 +1128,26 @@ class ClientMethods(ABC):
1127
1128
  )
1128
1129
  return self.do_request(api_request=api_request, return_type=lock_recipes_t.Data)
1129
1130
 
1131
+ def lookup_entity(
1132
+ self,
1133
+ *,
1134
+ entity_type: entity_t.EntityType,
1135
+ query: lookup_entity_t.LookupEntityQuery,
1136
+ ) -> lookup_entity_t.Data:
1137
+ """Look up an entity based on an identifier or field values
1138
+
1139
+ """
1140
+ args = lookup_entity_t.Arguments(
1141
+ entity_type=entity_type,
1142
+ query=query,
1143
+ )
1144
+ api_request = APIRequest(
1145
+ method=lookup_entity_t.ENDPOINT_METHOD,
1146
+ endpoint=lookup_entity_t.ENDPOINT_PATH,
1147
+ args=args,
1148
+ )
1149
+ return self.do_request(api_request=api_request, return_type=lookup_entity_t.Data)
1150
+
1130
1151
  def match_id_source(
1131
1152
  self,
1132
1153
  *,
@@ -17,6 +17,7 @@ __all__: list[str] = [
17
17
  # DO NOT MODIFY -- This file is generated by type_spec
18
18
  @serial_class(
19
19
  named_type_path="sdk.client_config.ClientConfigOptions",
20
+ explicit_defaults={"allow_insecure_tls"},
20
21
  )
21
22
  @dataclasses.dataclass(kw_only=True)
22
23
  class ClientConfigOptions:
@@ -44,15 +44,18 @@ __all__: list[str] = [
44
44
  "condition_parameter_value": "Condition Parameter Value",
45
45
  "constraint": "Constraint",
46
46
  "constraint_set": "Constraint Set",
47
+ "control_type": "Control Type",
47
48
  "curve_settings": "Curve Settings",
48
49
  "custom_entity": "Custom Entity",
50
+ "default_permissions_new_project": "Default Permissions New Project",
49
51
  "doe_run": "Suggest Experiments",
50
52
  "email_record_external": "External Emails",
51
53
  "email_relay_server": "Email Relay Server",
54
+ "enter_recipe_view_preference": "Enter Recipe View Preference",
52
55
  "enter_measurement_view_preference": "Enter Measurement View Preference",
53
- "enter_recipe_view_preference": "Enter Experiment View Preference",
54
56
  "entities_viewed": "Entities Viewed",
55
57
  "entity_annotation": "Annotation",
58
+ "entity_definition_field_group": "Entity Definition Field Group",
56
59
  "entity_field": "Field",
57
60
  "entity_field_audit_log": "Entity Field Audit Log",
58
61
  "entity_link": "Entity Link",
@@ -82,7 +85,7 @@ __all__: list[str] = [
82
85
  "ingredient_mat_family": "Ingredient Material Family",
83
86
  "ingredient_role": "Ingredient Role",
84
87
  "ingredient_tag": "Ingredient Subcategory",
85
- "ingredient_tag_map": "Ingredient Tag Map",
88
+ "ingredient_tag_map": "Ingredient Subcategory Mapping",
86
89
  "input_group": "Input Group",
87
90
  "inv_local_locations": "Inventory Location",
88
91
  "inventory_amount": "Inventory Item",
@@ -93,7 +96,9 @@ __all__: list[str] = [
93
96
  "license": "License",
94
97
  "maintenance_schedule": "Maintenance Schedule",
95
98
  "material_family": "Material Family",
96
- "measurement_group_recipe": "Measurement Group Experiment",
99
+ "measurement_group": "Measurement Group",
100
+ "measurement_group_input": "Measurement Group Input",
101
+ "measurement_group_recipe": "Measurement Group Recipe",
97
102
  "ml_job": "Batch Processing Job",
98
103
  "naming_scheme": "Naming Scheme",
99
104
  "naming_counter": "Naming Counter",
@@ -108,49 +113,59 @@ __all__: list[str] = [
108
113
  "output_condition_parameter_analytical_method_category": "Output Condition Parameter Analytical Method Category",
109
114
  "output_condition_parameter_analytical_method": "Output Condition Parameter Analytical Method",
110
115
  "output_group": "Output Group",
116
+ "output_preferences": "Output Preferences",
111
117
  "permission": "Permission",
112
- "permissions_recipe_link_inheritance": "Permissions Experiment Link Inheritance",
118
+ "permissions_recipe_link_inheritance": "Permissions Recipe Link Inheritance",
113
119
  "phase_workflow": "Phase Workflow",
114
120
  "platform_config": "Platform Config",
121
+ "portal_form": "Portal Form",
115
122
  "predictive_model": "Predictive Model",
116
123
  "product": "Product",
124
+ "product_material_family": "Product Material Family",
117
125
  "project": "Project",
118
126
  "project_workbook_comment": "Notebook Cell Comment",
119
127
  "recipe": "Experiment",
120
128
  "recipe_audit_log": "Experiment Audit Log",
121
- "recipe_calculation": "Experiment Calculation",
129
+ "recipe_calculation": "Recipe Calculation",
122
130
  "recipe_check": "Experiment Check",
123
- "recipe_export": "Experiment Export",
131
+ "recipe_export": "Recipe Export",
124
132
  "recipe_goal": "Experiment Goal",
125
- "recipe_ingredient": "Experiment Ingredient",
126
- "recipe_ingredient_actual": "Experiment Ingredient Actual",
127
- "recipe_ingredients_compounded": "Experiment Ingredients Compounded",
128
- "recipe_ingredients_compounded_calculation": "Experiment Ingredients Compounded Calculation",
129
- "recipe_output": "Experiment Output",
130
- "recipe_output_metadata": "Experiment Output Metadata",
131
- "recipe_permission_view": "Experiment Permission View",
132
- "recipe_project": "Experiment Project",
133
- "recipe_step": "Experiment Step",
134
- "recipe_workflow_step": "Experiment Workflow Step",
135
- "recipe_tag": "Experiment Tag",
133
+ "recipe_ingredient": "Recipe Ingredient",
134
+ "recipe_ingredient_actual": "Recipe Ingredient Actual",
135
+ "recipe_ingredients_compounded": "Recipe Ingredients Compounded",
136
+ "recipe_ingredients_compounded_calculation": "Recipe Ingredients Compounded Calculation",
137
+ "recipe_output": "Recipe Output",
138
+ "recipe_output_annotation": "Recipe Output Annotation",
139
+ "recipe_output_metadata": "Recipe Output Metadata",
140
+ "recipe_permission_view": "Recipe Permission View",
141
+ "recipe_project": "Recipe Project",
142
+ "recipe_step": "Recipe Step",
143
+ "recipe_workflow_step": "Recipe Workflow Step",
144
+ "recipe_tag": "Recipe Tag",
136
145
  "recipe_metadata": "Experiment Metadata",
137
146
  "recipe_metadata_mapping": "Experiment Metadata Mapping",
138
147
  "metadata_value": "Metadata Value",
139
148
  "review": "Review",
140
149
  "review_entity_user_status": "Review Entity User Status",
141
150
  "review_user": "Review User",
151
+ "rlw_audit_log": "Rlw Audit Log",
142
152
  "rlw_phase": "Phase",
143
153
  "rlw_trigger": "Trigger",
144
154
  "rlw_trigger_set": "Trigger Set",
155
+ "runsheet_configuration": "Runsheet Configuration",
145
156
  "safety_data_sheet": "Safety Data Sheet",
146
157
  "scheduled_notification": "Scheduled Notification",
158
+ "scratch_pad": "Scratch Pad",
147
159
  "specs": "Spec",
148
- "split_template": "Split Template",
160
+ "save": "Save",
161
+ "split_template": "Test Method",
149
162
  "structured_loading_user_config": "List Config",
163
+ "subscription": "Subscription",
150
164
  "table_builder_config": "Table Builder Config",
151
165
  "task": "Task",
152
166
  "task_board": "Task Board",
153
167
  "template": "Template",
168
+ "test_entity": "Test Entity",
154
169
  "time_series_segment": "Time Series Segment",
155
170
  "timesheet_entry": "Timesheet Entry",
156
171
  "training_run": "Analyze Experiment",
@@ -161,6 +176,7 @@ __all__: list[str] = [
161
176
  "units": "Units",
162
177
  "user_favorite": "User Favorite",
163
178
  "user": "User",
179
+ "user_analytics_event": "User Analytics Event",
164
180
  "user_certification": "User Certification",
165
181
  "user_group": "User Group",
166
182
  "user_list_set": "User List Set",
@@ -185,6 +201,7 @@ __all__: list[str] = [
185
201
  "public_data_sourced_condition_parameter": "ChemQuery Condition Parameter",
186
202
  "public_data_sourced_company": "ChemQuery Company",
187
203
  "uploader": "Uploader",
204
+ "calculation_material_family": "Calculation Material Family",
188
205
  },
189
206
  )
190
207
  class EntityType(StrEnum):
@@ -205,15 +222,18 @@ class EntityType(StrEnum):
205
222
  CONDITION_PARAMETER_VALUE = "condition_parameter_value"
206
223
  CONSTRAINT = "constraint"
207
224
  CONSTRAINT_SET = "constraint_set"
225
+ CONTROL_TYPE = "control_type"
208
226
  CURVE_SETTINGS = "curve_settings"
209
227
  CUSTOM_ENTITY = "custom_entity"
228
+ DEFAULT_PERMISSIONS_NEW_PROJECT = "default_permissions_new_project"
210
229
  DOE_RUN = "doe_run"
211
230
  EMAIL_RECORD_EXTERNAL = "email_record_external"
212
231
  EMAIL_RELAY_SERVER = "email_relay_server"
213
- ENTER_MEASUREMENT_VIEW_PREFERENCE = "enter_measurement_view_preference"
214
232
  ENTER_RECIPE_VIEW_PREFERENCE = "enter_recipe_view_preference"
233
+ ENTER_MEASUREMENT_VIEW_PREFERENCE = "enter_measurement_view_preference"
215
234
  ENTITIES_VIEWED = "entities_viewed"
216
235
  ENTITY_ANNOTATION = "entity_annotation"
236
+ ENTITY_DEFINITION_FIELD_GROUP = "entity_definition_field_group"
217
237
  ENTITY_FIELD = "entity_field"
218
238
  ENTITY_FIELD_AUDIT_LOG = "entity_field_audit_log"
219
239
  ENTITY_LINK = "entity_link"
@@ -254,6 +274,8 @@ class EntityType(StrEnum):
254
274
  LICENSE = "license"
255
275
  MAINTENANCE_SCHEDULE = "maintenance_schedule"
256
276
  MATERIAL_FAMILY = "material_family"
277
+ MEASUREMENT_GROUP = "measurement_group"
278
+ MEASUREMENT_GROUP_INPUT = "measurement_group_input"
257
279
  MEASUREMENT_GROUP_RECIPE = "measurement_group_recipe"
258
280
  ML_JOB = "ml_job"
259
281
  NAMING_SCHEME = "naming_scheme"
@@ -269,12 +291,15 @@ class EntityType(StrEnum):
269
291
  OUTPUT_CONDITION_PARAMETER_ANALYTICAL_METHOD_CATEGORY = "output_condition_parameter_analytical_method_category"
270
292
  OUTPUT_CONDITION_PARAMETER_ANALYTICAL_METHOD = "output_condition_parameter_analytical_method"
271
293
  OUTPUT_GROUP = "output_group"
294
+ OUTPUT_PREFERENCES = "output_preferences"
272
295
  PERMISSION = "permission"
273
296
  PERMISSIONS_RECIPE_LINK_INHERITANCE = "permissions_recipe_link_inheritance"
274
297
  PHASE_WORKFLOW = "phase_workflow"
275
298
  PLATFORM_CONFIG = "platform_config"
299
+ PORTAL_FORM = "portal_form"
276
300
  PREDICTIVE_MODEL = "predictive_model"
277
301
  PRODUCT = "product"
302
+ PRODUCT_MATERIAL_FAMILY = "product_material_family"
278
303
  PROJECT = "project"
279
304
  PROJECT_WORKBOOK_COMMENT = "project_workbook_comment"
280
305
  RECIPE = "recipe"
@@ -288,6 +313,7 @@ class EntityType(StrEnum):
288
313
  RECIPE_INGREDIENTS_COMPOUNDED = "recipe_ingredients_compounded"
289
314
  RECIPE_INGREDIENTS_COMPOUNDED_CALCULATION = "recipe_ingredients_compounded_calculation"
290
315
  RECIPE_OUTPUT = "recipe_output"
316
+ RECIPE_OUTPUT_ANNOTATION = "recipe_output_annotation"
291
317
  RECIPE_OUTPUT_METADATA = "recipe_output_metadata"
292
318
  RECIPE_PERMISSION_VIEW = "recipe_permission_view"
293
319
  RECIPE_PROJECT = "recipe_project"
@@ -300,18 +326,24 @@ class EntityType(StrEnum):
300
326
  REVIEW = "review"
301
327
  REVIEW_ENTITY_USER_STATUS = "review_entity_user_status"
302
328
  REVIEW_USER = "review_user"
329
+ RLW_AUDIT_LOG = "rlw_audit_log"
303
330
  RLW_PHASE = "rlw_phase"
304
331
  RLW_TRIGGER = "rlw_trigger"
305
332
  RLW_TRIGGER_SET = "rlw_trigger_set"
333
+ RUNSHEET_CONFIGURATION = "runsheet_configuration"
306
334
  SAFETY_DATA_SHEET = "safety_data_sheet"
307
335
  SCHEDULED_NOTIFICATION = "scheduled_notification"
336
+ SCRATCH_PAD = "scratch_pad"
308
337
  SPECS = "specs"
338
+ SAVE = "save"
309
339
  SPLIT_TEMPLATE = "split_template"
310
340
  STRUCTURED_LOADING_USER_CONFIG = "structured_loading_user_config"
341
+ SUBSCRIPTION = "subscription"
311
342
  TABLE_BUILDER_CONFIG = "table_builder_config"
312
343
  TASK = "task"
313
344
  TASK_BOARD = "task_board"
314
345
  TEMPLATE = "template"
346
+ TEST_ENTITY = "test_entity"
315
347
  TIME_SERIES_SEGMENT = "time_series_segment"
316
348
  TIMESHEET_ENTRY = "timesheet_entry"
317
349
  TRAINING_RUN = "training_run"
@@ -322,6 +354,7 @@ class EntityType(StrEnum):
322
354
  UNITS = "units"
323
355
  USER_FAVORITE = "user_favorite"
324
356
  USER = "user"
357
+ USER_ANALYTICS_EVENT = "user_analytics_event"
325
358
  USER_CERTIFICATION = "user_certification"
326
359
  USER_GROUP = "user_group"
327
360
  USER_LIST_SET = "user_list_set"
@@ -346,6 +379,7 @@ class EntityType(StrEnum):
346
379
  PUBLIC_DATA_SOURCED_CONDITION_PARAMETER = "public_data_sourced_condition_parameter"
347
380
  PUBLIC_DATA_SOURCED_COMPANY = "public_data_sourced_company"
348
381
  UPLOADER = "uploader"
382
+ CALCULATION_MATERIAL_FAMILY = "calculation_material_family"
349
383
 
350
384
 
351
385
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -16,9 +16,11 @@ from .field_values_t import FieldValueFieldOptions as FieldValueFieldOptions
16
16
  from .field_values_t import FieldValueId as FieldValueId
17
17
  from .field_values_t import FieldValueIds as FieldValueIds
18
18
  from .field_values_t import FieldValueText as FieldValueText
19
+ from .field_values_t import FieldValueTexts as FieldValueTexts
19
20
  from .field_values_t import FieldValueBoolean as FieldValueBoolean
20
21
  from .field_values_t import FieldValueNumeric as FieldValueNumeric
21
22
  from .field_values_t import FieldValueBatchReference as FieldValueBatchReference
23
+ from .field_values_t import FieldValueNull as FieldValueNull
22
24
  from .field_values_t import FieldValue as FieldValue
23
25
  from .field_values_t import FieldArgumentValue as FieldArgumentValue
24
26
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -29,8 +29,10 @@ __all__: list[str] = [
29
29
  "FieldValueFiles",
30
30
  "FieldValueId",
31
31
  "FieldValueIds",
32
+ "FieldValueNull",
32
33
  "FieldValueNumeric",
33
34
  "FieldValueText",
35
+ "FieldValueTexts",
34
36
  "FieldValueType",
35
37
  "ValueResolution",
36
38
  ]
@@ -89,6 +91,7 @@ class ArgumentValueId:
89
91
  class FieldValueType(StrEnum):
90
92
  FILES = "files"
91
93
  TEXT = "text"
94
+ TEXTS = "texts"
92
95
  ID = "id"
93
96
  IDS = "ids"
94
97
  BOOLEAN = "boolean"
@@ -96,6 +99,7 @@ class FieldValueType(StrEnum):
96
99
  BATCH_REFERENCE = "batch_reference"
97
100
  FIELD_OPTION = "field_option"
98
101
  FIELD_OPTIONS = "field_options"
102
+ NULL_VALUE = "null_value"
99
103
 
100
104
 
101
105
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -128,6 +132,7 @@ class ValueResolution(StrEnum):
128
132
  @serial_class(
129
133
  named_type_path="sdk.field_values.FieldValueFieldOption",
130
134
  parse_require={"type"},
135
+ explicit_defaults={"value_resolution"},
131
136
  )
132
137
  @dataclasses.dataclass(kw_only=True)
133
138
  class FieldValueFieldOption(FieldValueBase):
@@ -140,6 +145,7 @@ class FieldValueFieldOption(FieldValueBase):
140
145
  @serial_class(
141
146
  named_type_path="sdk.field_values.FieldValueFieldOptions",
142
147
  parse_require={"type"},
148
+ explicit_defaults={"value_resolution"},
143
149
  )
144
150
  @dataclasses.dataclass(kw_only=True)
145
151
  class FieldValueFieldOptions(FieldValueBase):
@@ -183,6 +189,17 @@ class FieldValueText(FieldValueBase):
183
189
  value: str
184
190
 
185
191
 
192
+ # DO NOT MODIFY -- This file is generated by type_spec
193
+ @serial_class(
194
+ named_type_path="sdk.field_values.FieldValueTexts",
195
+ parse_require={"type"},
196
+ )
197
+ @dataclasses.dataclass(kw_only=True)
198
+ class FieldValueTexts(FieldValueBase):
199
+ type: typing.Literal[FieldValueType.TEXTS] = FieldValueType.TEXTS
200
+ value: list[str]
201
+
202
+
186
203
  # DO NOT MODIFY -- This file is generated by type_spec
187
204
  @serial_class(
188
205
  named_type_path="sdk.field_values.FieldValueBoolean",
@@ -218,9 +235,19 @@ class FieldValueBatchReference(FieldValueBase):
218
235
  data_key: str
219
236
 
220
237
 
238
+ # DO NOT MODIFY -- This file is generated by type_spec
239
+ @serial_class(
240
+ named_type_path="sdk.field_values.FieldValueNull",
241
+ parse_require={"type"},
242
+ )
243
+ @dataclasses.dataclass(kw_only=True)
244
+ class FieldValueNull(FieldValueBase):
245
+ type: typing.Literal[FieldValueType.NULL_VALUE] = FieldValueType.NULL_VALUE
246
+
247
+
221
248
  # DO NOT MODIFY -- This file is generated by type_spec
222
249
  FieldValue = typing.Annotated[
223
- FieldValueFiles | FieldValueId | FieldValueIds | FieldValueText | FieldValueBoolean | FieldValueNumeric | FieldValueBatchReference | FieldValueFieldOption | FieldValueFieldOptions,
250
+ FieldValueFiles | FieldValueId | FieldValueIds | FieldValueText | FieldValueTexts | FieldValueBoolean | FieldValueNumeric | FieldValueBatchReference | FieldValueFieldOption | FieldValueFieldOptions | FieldValueNull,
224
251
  serial_union_annotation(
225
252
  named_type_path="sdk.field_values.FieldValue",
226
253
  ),
@@ -109,6 +109,7 @@ UploadDestination = typing.Annotated[
109
109
  # DO NOT MODIFY -- This file is generated by type_spec
110
110
  @serial_class(
111
111
  named_type_path="sdk.generic_upload.GenericUploadStrategy",
112
+ explicit_defaults={"skip_moving_files"},
112
113
  )
113
114
  @dataclasses.dataclass(kw_only=True)
114
115
  class GenericUploadStrategy:
@@ -168,6 +168,7 @@ JobExecutor = typing.Annotated[
168
168
  # DO NOT MODIFY -- This file is generated by type_spec
169
169
  @serial_class(
170
170
  named_type_path="sdk.job_definition.JobLoggingSettings",
171
+ explicit_defaults={"enabled"},
171
172
  )
172
173
  @dataclasses.dataclass(kw_only=True)
173
174
  class JobLoggingSettings:
@@ -178,6 +179,7 @@ class JobLoggingSettings:
178
179
  # DO NOT MODIFY -- This file is generated by type_spec
179
180
  @serial_class(
180
181
  named_type_path="sdk.job_definition.JobDefinitionBase",
182
+ explicit_defaults={"enabled"},
181
183
  )
182
184
  @dataclasses.dataclass(kw_only=True)
183
185
  class JobDefinitionBase:
@@ -59,6 +59,7 @@ class RecipeWorkflowStepPosition(StrEnum):
59
59
  @serial_class(
60
60
  named_type_path="sdk.recipe_workflow_steps.RecipeWorkflowStepIdentifierWorkflowStep",
61
61
  parse_require={"type"},
62
+ explicit_defaults={"position"},
62
63
  )
63
64
  @dataclasses.dataclass(kw_only=True)
64
65
  class RecipeWorkflowStepIdentifierWorkflowStep(RecipeWorkflowStepIdentifierBase):
@@ -18,6 +18,7 @@ __all__: list[str] = [
18
18
  @serial_class(
19
19
  named_type_path="sdk.response.Response",
20
20
  parse_require={"status"},
21
+ explicit_defaults={"status"},
21
22
  )
22
23
  @dataclasses.dataclass(kw_only=True)
23
24
  class Response:
@@ -5,4 +5,5 @@
5
5
  # Kept only for SDK backwards compatibility
6
6
  from .webhook_job_t import WebhookEventPayload as WebhookEventPayload
7
7
  from .webhook_job_t import WebhookEventBody as WebhookEventBody
8
+ from .webhook_job_t import RunsheetWebhookPayload as RunsheetWebhookPayload
8
9
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -9,8 +9,10 @@ from decimal import Decimal # noqa: F401
9
9
  import dataclasses
10
10
  from pkgs.serialization import serial_class
11
11
  from . import base_t
12
+ from . import entity_t
12
13
 
13
14
  __all__: list[str] = [
15
+ "RunsheetWebhookPayload",
14
16
  "WebhookEventBody",
15
17
  "WebhookEventPayload",
16
18
  ]
@@ -33,4 +35,13 @@ class WebhookEventPayload:
33
35
  @dataclasses.dataclass(kw_only=True)
34
36
  class WebhookEventBody(WebhookEventPayload):
35
37
  event_id: str
38
+
39
+
40
+ # DO NOT MODIFY -- This file is generated by type_spec
41
+ @serial_class(
42
+ named_type_path="sdk.webhook_job.RunsheetWebhookPayload",
43
+ )
44
+ @dataclasses.dataclass(kw_only=True)
45
+ class RunsheetWebhookPayload:
46
+ entities: list[entity_t.Entity]
36
47
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.103
3
+ Version: 0.0.105
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
@@ -3,7 +3,7 @@ docs/conf.py,sha256=YF5J-9g_Wg8wXmyHsGaE8xYlDEzqocNl3UWUmP0CwBg,1702
3
3
  docs/index.md,sha256=eEdirX_Ds6ICTRtIS5iT4irCquHcQyKN7E4M5QP9T8A,257
4
4
  docs/justfile,sha256=Ej6_tqyrBIQaEXOwjIrwIfhTOOC-9xZr0i7wPWhDJkQ,273
5
5
  docs/quickstart.md,sha256=3GuJ0MB1O5kjlsrgAmdSkDq0rYqATrYy-tzEHDy8H-c,422
6
- docs/requirements.txt,sha256=jyGjzxSfYlDaELlnD_G2PE7wMFV0b3aB_kUaJrC1HRo,153
6
+ docs/requirements.txt,sha256=boDCqjFBcBYm1T6FHTF2j5XqVX8s5YIsoB4r3HK0HPg,153
7
7
  docs/static/logo_blue.png,sha256=SyYpMTVhhBbhF5Wl8lWaVwz-_p1MIR6dW6bVhufQRME,46708
8
8
  docs/static/favicons/android-chrome-192x192.png,sha256=XoF-AhD55JlSBDGsEPJKfT_VeXT-awhwKyZnxLhrwvk,1369
9
9
  docs/static/favicons/android-chrome-512x512.png,sha256=1S4xwY9YtJQ5ifFsZ-DOzssoyBYs0t9uwdOUmYx0Xso,3888
@@ -24,14 +24,14 @@ examples/set_recipe_output_file_sdk.py,sha256=Lz1amqppnWTX83z-C090wCJ4hcKmCD3kb-
24
24
  examples/upload_files.py,sha256=qMaSvMSdTMPOOP55y1AwEurc0SOdZAMvEydlqJPsGpg,432
25
25
  examples/integration-server/pyproject.toml,sha256=VjUN8AZWIzliyLVX2hLfoMAOzxGini62g1287kJflr4,9127
26
26
  examples/integration-server/jobs/materials_auto/example_cron.py,sha256=7VVQ-UJsq3DbGpN3XPnorRVZYo-vCwbfSU3VVDluIzA,699
27
- examples/integration-server/jobs/materials_auto/example_wh.py,sha256=Hx5nonavOh2L3JykDpI5bPqPu8L1wwhwekTUfTRgq9g,479
27
+ examples/integration-server/jobs/materials_auto/example_wh.py,sha256=PN-skP27yJwDZboWk5g5EZEc3AKfVayQLfnopjsDKJc,659
28
28
  examples/integration-server/jobs/materials_auto/profile.yaml,sha256=XlOXSRplMJ13T6900pv1wDKxeE9V1hZZTMuvup1MiBM,896
29
29
  pkgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  pkgs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  pkgs/argument_parser/__init__.py,sha256=VWUOOtJ-ueRF2lkIJzgQe4xhBKR9IPkgf9vY28nF35s,870
32
32
  pkgs/argument_parser/_is_enum.py,sha256=Gw6jJa8nBwYGqXwwCZbSnWL8Rvr5alkg5lSVAqXtOZM,257
33
33
  pkgs/argument_parser/_is_namedtuple.py,sha256=Rjc1bKanIPPogl3qG5JPBxglG1TqWYOo1nxxhBASQWY,265
34
- pkgs/argument_parser/argument_parser.py,sha256=_0vZH2yr_yzakQ4KpucAS8xSGbBhxF-k7vWMLSYfgaA,19654
34
+ pkgs/argument_parser/argument_parser.py,sha256=3SR0EX5ZNz5kGDcWWrzQKNkGgWsaSMgTLVVgs-GJeRU,20879
35
35
  pkgs/argument_parser/case_convert.py,sha256=NuJLJUJRbyVb6_Slen4uqaStEHbcOS1d-hBBfDrrw-c,605
36
36
  pkgs/filesystem_utils/__init__.py,sha256=2a0d2rEPlEEYwhm3Wckny4VCp4ZS7JtYSXmwdwNCRjo,1332
37
37
  pkgs/filesystem_utils/_blob_session.py,sha256=CtoB7PIocuZo8vvFIS_Rc-YR6KwzFB0rHUVPKFEbRAI,4862
@@ -46,7 +46,7 @@ pkgs/serialization/annotation.py,sha256=wn9yb4a4DrsyPAYqY9mVswJarP4lsOkgfnvchrg5
46
46
  pkgs/serialization/missing_sentry.py,sha256=89SomyM0sBWLr_N0SPOyxU3hWcm1ljL-veTazZ1-GU8,811
47
47
  pkgs/serialization/opaque_key.py,sha256=8ak7aMCGWkKDjnG374yqy8gtnCCUzG2DSJEBfoPgi0c,194
48
48
  pkgs/serialization/serial_alias.py,sha256=zP0wAy7NGvpyOe-TGUwHy3wPF0XZTIwFLh_caDX67BU,1343
49
- pkgs/serialization/serial_class.py,sha256=xMcvPJ5fdaaI9dY5SAz3vMKY0V6KvnDKp5-YsgYvLLk,6085
49
+ pkgs/serialization/serial_class.py,sha256=uBfleDXvSZcPfPSzLIqKTocXix5i-lMjidnS9-xQXR8,6711
50
50
  pkgs/serialization/serial_generic.py,sha256=vAC0-o9fkco2lM_YvBavY0JDYncDxbW3jFboYeHRImw,461
51
51
  pkgs/serialization/serial_union.py,sha256=IdWsSsM8j-qGfl5Wv6haX37ZS1SKob8XT8cilBBOVIo,2670
52
52
  pkgs/serialization/yaml.py,sha256=yoJtu7_ixnJV6uTxA_U1PpK5F_ixT08AKVh5ocyYwXM,1466
@@ -59,13 +59,13 @@ pkgs/strenum_compat/__init__.py,sha256=wXRFeNvBm8RU6dy1PFJ5sRLgUIEeH_DVR95Sv5qpG
59
59
  pkgs/strenum_compat/strenum_compat.py,sha256=uOUAgpYTjHs1MX8dG81jRlyTkt3KNbkV_25zp7xTX2s,36
60
60
  pkgs/type_spec/__init__.py,sha256=h5DmJTca4QVV10sZR1x0-MlkZfuGYDfapR3zHvXfzto,19
61
61
  pkgs/type_spec/__main__.py,sha256=5bJaX9Y_-FavP0qwzhk-z-V97UY7uaezJTa1zhO_HHQ,1048
62
- pkgs/type_spec/builder.py,sha256=8oiNhxN_pidHkB62zt1rLsLnAPsNhC2QyFf8t1ePFns,52728
62
+ pkgs/type_spec/builder.py,sha256=6m9sWeap0Hh8LkcQpufO5mkFRNIFIBKhEA02Q23PrSs,53071
63
63
  pkgs/type_spec/config.py,sha256=HThKnWQ4zkWOyUIb12hTodsrvEnhSzOvhHKCOeTM0iY,5302
64
64
  pkgs/type_spec/cross_output_links.py,sha256=nmyWUaFRk7MLTdJiosfKkhOb4VLE71A3DDKKwTZAncY,3123
65
65
  pkgs/type_spec/emit_io_ts.py,sha256=CUvBs0boB_X-Kndh66yYcqFfq3oC_LGs8YffLkJ0ZXA,5707
66
66
  pkgs/type_spec/emit_open_api.py,sha256=kHP4jKRica4Us28_9G2iHq9K7BrUdsl8daIIHZaPdws,25000
67
67
  pkgs/type_spec/emit_open_api_util.py,sha256=UwaUcgqTwl_D8s2y6ic3fC23VllVcP0w_2iUg9ThYCA,2361
68
- pkgs/type_spec/emit_python.py,sha256=aHRrEGx_WAnf5w5zN7lWrIToslh8l-yJtGn50r_6fr4,52402
68
+ pkgs/type_spec/emit_python.py,sha256=nVCKbXfFCGUrYkLWZehJgcrR_7o5pAbqb97f_EeYEn8,52732
69
69
  pkgs/type_spec/emit_typescript.py,sha256=0HRzxlbIP91rzbVkAntF4TKZppoKcWsqnDLAIRc1bng,10927
70
70
  pkgs/type_spec/emit_typescript_util.py,sha256=8ophCR8MX0IvYtLYu3omfPQk2H6BeYGd2psRir9ImmQ,10550
71
71
  pkgs/type_spec/load_types.py,sha256=GndEKQtICCQi4oXsL6cZ9khm8lBB830e6hx0wML4dHs,4278
@@ -80,9 +80,9 @@ pkgs/type_spec/parts/base.ts.prepart,sha256=2FJJvpg2olCcavxj0nbYWdwKl6KeScour2Jj
80
80
  pkgs/type_spec/type_info/__main__.py,sha256=TLNvCHGcmaj_8Sj5bAQNpuNaaw2dpDzoFDWZds0V4Qo,1002
81
81
  pkgs/type_spec/type_info/emit_type_info.py,sha256=Rro9QVq6ZxEDm_gWlwtqqLeazelGIZhSf4pHtMUIJyo,14495
82
82
  pkgs/type_spec/value_spec/__init__.py,sha256=Z-grlcZtxAfEXhPHsK0nD7PFLGsv4eqvunaPN7_TA84,83
83
- pkgs/type_spec/value_spec/__main__.py,sha256=hCTdANTgCNTdZVcXeUd8axENrKNb_oVNrmrygjQht48,8663
83
+ pkgs/type_spec/value_spec/__main__.py,sha256=D1ofjeEs3qFpB_GUZR1rZbryc0nMEyWj54VyhI-RqpI,8875
84
84
  pkgs/type_spec/value_spec/convert_type.py,sha256=X5N7DOTo5XOIHbcYHh9RZFthzb2gcnYg2tRuVMBhbxY,2517
85
- pkgs/type_spec/value_spec/emit_python.py,sha256=lWO4PFcXo0jgkQy6ZAVN4QJ1jdNXXzkS3oxWCtycQ4k,7131
85
+ pkgs/type_spec/value_spec/emit_python.py,sha256=YQCkc9nHYKkFbdqLOW3YT39wciunE58yDuzdXn2rW5Q,7214
86
86
  pkgs/type_spec/value_spec/types.py,sha256=Yc3LaKHN1G6wbgrBv0dpu5vijUXtS2GcDTusYPnDvK0,454
87
87
  uncountable/__init__.py,sha256=8l8XWNCKsu7TG94c-xa2KHpDegvxDC2FyQISdWC763Y,89
88
88
  uncountable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -97,7 +97,7 @@ uncountable/integration/cli.py,sha256=h3RE0l1SdjkveOKeY2amlmrJppK4HEQJXk8VG9UJRW
97
97
  uncountable/integration/construct_client.py,sha256=I53mGcdS88hba3HFwgXmWQaTd1d5u0jWNSwyc_vlVsQ,1937
98
98
  uncountable/integration/cron.py,sha256=6eH-kIs3sdYPCyb62_L2M7U_uQTdMTdwY5hreEJb0hw,887
99
99
  uncountable/integration/entrypoint.py,sha256=BHOYPQgKvZE6HG8Rv15MkdYl8lRkvfDgv1OdLo0oQ9Q,433
100
- uncountable/integration/job.py,sha256=zamfyEhtZh0cWyd8DvVq64RlaA1aX_wtOALv6Kf7tyo,2354
100
+ uncountable/integration/job.py,sha256=vWmLSA-RgF9D32BJmtzvgWq5hk7FbTWSaNQ5Zwq03U4,2542
101
101
  uncountable/integration/scan_profiles.py,sha256=760zbv7O7wXxHUHqUkFBpd1Afe8hqxMPU3ugwZGdhEo,2925
102
102
  uncountable/integration/scheduler.py,sha256=99Vq9RBdK_clu4-dS7JtU4aqcxZicG8Njt992if2jK8,4811
103
103
  uncountable/integration/server.py,sha256=m_DYRosGbHuPhygM32Xo-jRBl_oaUhOYsBBD1qwwKh4,4697
@@ -144,21 +144,21 @@ uncountable/types/calculations.py,sha256=fApOFpgBemt_t7IVneVR0VdI3X5EOxiG6Xhzr6R
144
144
  uncountable/types/calculations_t.py,sha256=LE_HWYPf7yxNTpH5sVPaC0e98OxJ5hUOhHezeJNKDtk,648
145
145
  uncountable/types/chemical_structure.py,sha256=ujyragaD26-QG5jgKnWhO7TN3N1V9b_04T2WhqNYxxo,281
146
146
  uncountable/types/chemical_structure_t.py,sha256=iYmGER_vXqoksv2Nr189qU1Zm70s-U49Eiv0DkWaB1I,773
147
- uncountable/types/client_base.py,sha256=EMf8jyO2gJ3M_2ypkddkF_4O-bjLJ7n4qSWQW0EHYZ8,71372
147
+ uncountable/types/client_base.py,sha256=wB2ABAvMqgyUzHKMfx1Js-kXll1IfIH2hoVhQwFDSVA,72069
148
148
  uncountable/types/client_config.py,sha256=qLpHt4O_B098CyN6qQajoxZ2zjZ1DILXLUEGyyGP0TQ,280
149
- uncountable/types/client_config_t.py,sha256=k_UkjemqiVuJBiFUjJYk3h673Nahr0nGZvfEZFzsC0k,699
149
+ uncountable/types/client_config_t.py,sha256=ovNtGbinjSYZiC-rpYINhtEb4HcwXBDmlJDaFx8Qano,745
150
150
  uncountable/types/curves.py,sha256=QyEyC20jsG-LGKVx6miiF-w70vKMwNkILFBDIJ5Ok9g,345
151
151
  uncountable/types/curves_t.py,sha256=2_9qdrSl1XAvIG57lo45KWNpa0wXgZ97OkSRCPRrudc,1347
152
152
  uncountable/types/entity.py,sha256=Zclk1LYcRaYrMDhqyCjMSLEg0fE6_q8LHvV22Qvscgs,566
153
- uncountable/types/entity_t.py,sha256=MujknU1WOE77q1qS67ub3QSBYhed2j8lbZpSkkotsRs,17874
153
+ uncountable/types/entity_t.py,sha256=vxOkzHLu8FeBCRjjt43261iwxx5CBlWcJaBudP8LMLw,19493
154
154
  uncountable/types/experiment_groups.py,sha256=qUpFOx1AKgzaT_4khCOv5Xs6jwiQGbvHH-GUh3v1nv4,288
155
155
  uncountable/types/experiment_groups_t.py,sha256=_fAYZwqYLR3cFdv2vwLOYs5TvH5CEWDEbh3kFpg26zY,700
156
- uncountable/types/field_values.py,sha256=_5PSyCRPA0IlRThRa8Ny3p0jrumnVvbz_3jyQvnmCp4,1396
157
- uncountable/types/field_values_t.py,sha256=IE6Q8OFwy1KTZM7-xzohSnPfzJfjR7z2qwR-Atcafho,6909
156
+ uncountable/types/field_values.py,sha256=jPGc1mLXGpldQ1CVf35NZIaufpTQy0cOtADBr1RTyus,1520
157
+ uncountable/types/field_values_t.py,sha256=fWwQh1PJysMS8tphy_OO4t1rW44k66jWzGLOxQxdWBg,7764
158
158
  uncountable/types/fields.py,sha256=M0_ZZr0QdNLXkdHAGo5mfU90kEtHedCSKrcod-FG30Y,245
159
159
  uncountable/types/fields_t.py,sha256=Ze-X83HyM7q4oMk5LLRfPqvRojyAx6dDqIUPX70gNYc,644
160
160
  uncountable/types/generic_upload.py,sha256=bNep2nT0fbKAlJaGvHWPmuvfX5KtS8kgTqTh8FQk1NA,858
161
- uncountable/types/generic_upload_t.py,sha256=z7rxOu8SEyOmIlz06AAXmRkbQdBEpZigb8N2eGi6XIY,3756
161
+ uncountable/types/generic_upload_t.py,sha256=yvM1uaEVXy8H9OsBWr-ltzeyTuDKDZ6ZuvwBbB779m8,3801
162
162
  uncountable/types/id_source.py,sha256=sBlDfUwHQ7bGWMschSD_aPQL7LVnCPiV2RAlPLXrAqk,546
163
163
  uncountable/types/id_source_t.py,sha256=XzxQWkD0iQoq6LxtpCVWylYtOvq5dXslu_2ML1xNP_U,1838
164
164
  uncountable/types/identifier.py,sha256=J-ptCFE0_R0bBAvrYp-gvHk8H9Qq9rhbmeyXgwb9nos,482
@@ -170,7 +170,7 @@ uncountable/types/inputs_t.py,sha256=0b3U77JcZT4hgUvbP_i-E5RoJbJnRxn3OKBqGWu32TM
170
170
  uncountable/types/integration_server.py,sha256=VonA8h8TGnVBiss5W8-K82lA01JQa7TLk0ubFo8iiBQ,364
171
171
  uncountable/types/integration_server_t.py,sha256=37zyqeet54P9m6pxaZfLOgZCqqZA2dxJ5gl6NCoelQ0,1188
172
172
  uncountable/types/job_definition.py,sha256=6BkLZrmTfIYh45XFGZ5HOYveued0YXvl17YTlXblXjw,1646
173
- uncountable/types/job_definition_t.py,sha256=ed_fCyLFQBo6XDfqtfUnk4ghmx0uGtDHVEnNB1N_yv4,7837
173
+ uncountable/types/job_definition_t.py,sha256=GQcs1mpl3QO1opqGAs5dmtdPwxpTPIq52Ei2pq7n9s0,7907
174
174
  uncountable/types/outputs.py,sha256=I6zP2WHXg_jXgMqmuEJuJOlsjKjQGHjfs1JOwW9YxBM,260
175
175
  uncountable/types/outputs_t.py,sha256=ZJhKKkksJ-K7iuuumCly9edU8TRv-eWol4PKG7XPo3E,734
176
176
  uncountable/types/overrides.py,sha256=fOvj8P9K9ul8fnTwA--l140EWHuc1BFq8tXgtBkYld4,410
@@ -196,19 +196,19 @@ uncountable/types/recipe_output_metadata_t.py,sha256=llf9O2vK6AFRva5hx0VdiKXT9XQ
196
196
  uncountable/types/recipe_tags.py,sha256=tKIwHY677lZCxrmOk1bbuZQgDuf1n1cNyp6c5r1uRbo,270
197
197
  uncountable/types/recipe_tags_t.py,sha256=7qi9m8NAq7BdocIBdYyMVArFnPJrwuX0B9qoqlJiwzM,670
198
198
  uncountable/types/recipe_workflow_steps.py,sha256=fb55_sREdeZrtguIZOuy4ZcTLbRBNAxQ3A0oGbH8muA,950
199
- uncountable/types/recipe_workflow_steps_t.py,sha256=dwjuFI6ncLBwr7Ufa-W26nrfF-BqZ_pKFIpKP05WqOo,3406
199
+ uncountable/types/recipe_workflow_steps_t.py,sha256=8MhOr-x9Fm9OiAefAwn2BDR8gadSqjKdGvi55U8a7c8,3442
200
200
  uncountable/types/recipes.py,sha256=6Z7bagYXX15kGlhYt_OFiYSD3lqFp4H0EquI1fUfYyk,286
201
201
  uncountable/types/recipes_t.py,sha256=GBT56H34_pqAdeTgcye6ZNZLR1V47lG_S-R_uV-XUh8,652
202
202
  uncountable/types/response.py,sha256=SJTwjTxZGItGJJYPZ_T1zTooEbtR5ZA8GT_cf8aXfn8,253
203
- uncountable/types/response_t.py,sha256=I4lArMXf50SFWon_Tl9AJjqqrzvfeSXv_C-AKfnGcZM,646
203
+ uncountable/types/response_t.py,sha256=XQ-0PHv3uxyVSJdoT50f0gDynTfC3jKa1MlNugBMdcE,680
204
204
  uncountable/types/secret_retrieval.py,sha256=poY_nuZBIjNu64Wa0x5Ytsmh3OdAxps2kzuDgv1sa_8,571
205
205
  uncountable/types/secret_retrieval_t.py,sha256=hcJRp2OLPd5m7twve63F8gloL8KFJiCtyJD17H6WiAc,2138
206
206
  uncountable/types/units.py,sha256=yxuddayiE8cnzrjQiIsURisWc-Vm1F37uyS3fjM--Ao,254
207
207
  uncountable/types/units_t.py,sha256=DUP2ydfWdPM8X4sBGOvm6g7CoZ1kqwpWidwSlWYQEek,643
208
208
  uncountable/types/users.py,sha256=R-bFIh07mMl6HyxP8hKmlT-QMbBXZPZ7mVuOIeOlCsg,254
209
209
  uncountable/types/users_t.py,sha256=rpwi31aZMyrNJgzUUPgo2lHAlYv82UKr5XGq1XmkrUA,666
210
- uncountable/types/webhook_job.py,sha256=3LdsSMCNmZZrFwTHJpVR7XzIJiu2T2cbE-0ScwfLMBc,342
211
- uncountable/types/webhook_job_t.py,sha256=BJvqdio9n93qhNw1aUWkU0WaGqXU_03qSzBM1gj3_9E,958
210
+ uncountable/types/webhook_job.py,sha256=22fT212MjSpKZNzDjpFbAEW2-UBGRsDHf3Z8ChHpS_g,418
211
+ uncountable/types/webhook_job_t.py,sha256=EW4bSfnadSkJJ0d8Yo4B-6BY3q4n4KIpYfvQCoFRWiY,1250
212
212
  uncountable/types/workflows.py,sha256=sZhBDSzu85M0teTRiKNqd389oUK2tMcWGpKUlKIuSdY,332
213
213
  uncountable/types/workflows_t.py,sha256=UCsCd_1-SHRZZljpQRxOuM74epKH2H5D2qfSNDzI2Ek,986
214
214
  uncountable/types/api/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
@@ -225,7 +225,7 @@ uncountable/types/api/entity/get_entities_data.py,sha256=OUeBo0YkZmVTHT2EHAQt19r
225
225
  uncountable/types/api/entity/grant_entity_permissions.py,sha256=Zx3FDHSjiBN_wRtmxbWSWdmT-CkzEoi2uoVLCIdS2Q8,1391
226
226
  uncountable/types/api/entity/list_entities.py,sha256=1I6T6fjfolXx1lg8iRiCO5J0ieU0bdudPp31ZmMkXIQ,1895
227
227
  uncountable/types/api/entity/lock_entity.py,sha256=cWRTNlXj6Ei1M0mHwfbhid7hQs4whCheUCOmf8PIGqw,1166
228
- uncountable/types/api/entity/lookup_entity.py,sha256=_Znw-Kiw6y9YCpZXE2APhgxJ4aEK_5rVwl6003c8N0g,2803
228
+ uncountable/types/api/entity/lookup_entity.py,sha256=rypZBAnnKF_HQlwySy_hQkNf0fr8z6cYqt41O580T0g,2971
229
229
  uncountable/types/api/entity/resolve_entity_ids.py,sha256=44B79L4erUB0G90WBGor0ZPs3XhdkuX7ZvgVF9uWB2M,1340
230
230
  uncountable/types/api/entity/set_entity_field_values.py,sha256=ZYtRrsx0MWc0txC6yH2HtCONC5A0IolpqvwHm_YgirU,1179
231
231
  uncountable/types/api/entity/set_values.py,sha256=2lANfjqPOcyxqDeISmzW0KghVbe8_i4QNkcLXzdAkag,1104
@@ -269,7 +269,7 @@ uncountable/types/api/recipe_metadata/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrH
269
269
  uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py,sha256=fW-6_vBIGa5Wx8JvEdpKb3orXD60DX_wOeHnmMPduc8,1550
270
270
  uncountable/types/api/recipes/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
271
271
  uncountable/types/api/recipes/add_recipe_to_project.py,sha256=vJL6DljCu4okNHvXJ5_uaBj0-QDEm9iTvVGMLYyDd2U,1061
272
- uncountable/types/api/recipes/add_time_series_data.py,sha256=1pghWSwdbaEo--M__2VqYyGRMeXXh_G2--OzuhNWLpE,1737
272
+ uncountable/types/api/recipes/add_time_series_data.py,sha256=xD7W4PjoWnGamimGY4DsJlyDjFz4SnhpTDjwtheVaQM,1776
273
273
  uncountable/types/api/recipes/archive_recipes.py,sha256=07Rjd9kwh5pMpiMXNr9OfjOB4vYXeuLjQtBxrXkXC7o,1024
274
274
  uncountable/types/api/recipes/associate_recipe_as_input.py,sha256=TtsAJRT9vRjnsIh0IvfFimA2hstZvgyn6rpaDIsDfK4,1194
275
275
  uncountable/types/api/recipes/associate_recipe_as_lot.py,sha256=_4SgFfH-wFxW9Vevv9k3G3T10Uz8CMLjuiDEv1oT2So,1138
@@ -277,29 +277,29 @@ uncountable/types/api/recipes/clear_recipe_outputs.py,sha256=BfTQrV79UePkJ4HSSix
277
277
  uncountable/types/api/recipes/create_recipe.py,sha256=tVeQgikCWAwGtxpq2vLyXd5Aeqo_8Tde64x5GAOJl50,1472
278
278
  uncountable/types/api/recipes/create_recipes.py,sha256=J1CBE13d8JaVpUxOftFg1Plo8RKa0vc-A2nHdO1yoj8,1862
279
279
  uncountable/types/api/recipes/disassociate_recipe_as_input.py,sha256=zWUfwJlkgWexblqKCKCF5HWR40ynQ8rg_PPo2WPGISY,1106
280
- uncountable/types/api/recipes/edit_recipe_inputs.py,sha256=NEK0PrM-SnGx95KcjpSWimi3xTrOMKO8BMURom08ppc,9837
280
+ uncountable/types/api/recipes/edit_recipe_inputs.py,sha256=nhPN0MdAx7FtdGKB3xbWQ3rdHk1QtblcT3D-DC1hexE,9963
281
281
  uncountable/types/api/recipes/get_column_calculation_values.py,sha256=9eqURjD2Mwm2lyV1bJIq66Z7a3enLhhx_scZBt4SYYc,1671
282
282
  uncountable/types/api/recipes/get_curve.py,sha256=C-elYAKcBw7P5bWwN-8p_SWj15l5aBJrKNR8yjphZ-Q,1085
283
283
  uncountable/types/api/recipes/get_recipe_calculations.py,sha256=iBmkhKC1qBFxuPPziM3LD6tGsdsN_xb4NcUaJwF6cHU,1679
284
- uncountable/types/api/recipes/get_recipe_links.py,sha256=jYygHnuzTzuc_H8AG72Ihrb38kEhtfbVNlb4b7elLfI,1149
284
+ uncountable/types/api/recipes/get_recipe_links.py,sha256=Hn35wrJlJHQ00MhpHlva0Oc29Dy0lg013VCW4eWl0SU,1182
285
285
  uncountable/types/api/recipes/get_recipe_names.py,sha256=HXv39OI6GRedSAKOhurEQEY_djaxvJcxlTTWghLgA5I,1274
286
286
  uncountable/types/api/recipes/get_recipe_output_metadata.py,sha256=7lF2cnRsBLPDSsjlNIy-aJ4Dao5-qe7WrNaf4XNmq74,1703
287
287
  uncountable/types/api/recipes/get_recipes_data.py,sha256=srZBvl8dCdoo7yil0D1ohAxnbMaCS28ctCH93NaYQd0,6099
288
- uncountable/types/api/recipes/lock_recipes.py,sha256=8z_g5lokbzkATZvN5Vpvx6uXS3xPZN77AP5OhHPsGhc,1581
288
+ uncountable/types/api/recipes/lock_recipes.py,sha256=G5BAPZe3WUMd2Okc8FC9YJBMrfI0mrD-ZY-6sup9vZg,1613
289
289
  uncountable/types/api/recipes/remove_recipe_from_project.py,sha256=_KWbYnMMEOZAaC_jdXZvCEYXJaVhs3x27ZWlJbq3CV4,1076
290
290
  uncountable/types/api/recipes/set_recipe_inputs.py,sha256=RvWj2SOtcuy_msp9pUjz20O3Y_EjEMKd48o-RhpCDNE,1583
291
291
  uncountable/types/api/recipes/set_recipe_metadata.py,sha256=R4GVqpMJdJuoSXsJx1e4vhmWqKKTPMyPPEArwV45crI,1104
292
292
  uncountable/types/api/recipes/set_recipe_output_annotations.py,sha256=yczFBmuB0grzNWsnXspCPUsDA608M9wGkJ2dugyxG4U,3526
293
293
  uncountable/types/api/recipes/set_recipe_output_file.py,sha256=W_qvEkZxzDczwU9EZ7zKyBmLGnO6GFqMsJ3zwXCnpA0,1502
294
- uncountable/types/api/recipes/set_recipe_outputs.py,sha256=FyReW7TLJ9eyO5lmL9U8o6DLxxxMp78Z__rLIAyd9IM,2366
294
+ uncountable/types/api/recipes/set_recipe_outputs.py,sha256=EhcEDuha4fcdN15Cr4LaRHs96gQa3jsjMYNBfpOKI8M,2407
295
295
  uncountable/types/api/recipes/set_recipe_tags.py,sha256=HS5GG-nTy0vTNTANG-ROawku0VhzOs0hIzGKfRFefYY,3098
296
296
  uncountable/types/api/recipes/unarchive_recipes.py,sha256=G0jYuarNZLmTCQ6m5_ZAUwBl4M8_cqKRlP-jMJp-Rcw,1000
297
- uncountable/types/api/recipes/unlock_recipes.py,sha256=QFvz13eJipWQlIRrqOybnIPeJxfR4yZM8yIr841jd28,1258
297
+ uncountable/types/api/recipes/unlock_recipes.py,sha256=D2CyWCt6eO5Fa2pRN4GScF2XT1SjlSWvUiqPiU7Dng8,1290
298
298
  uncountable/types/api/triggers/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
299
299
  uncountable/types/api/triggers/run_trigger.py,sha256=diX1ix_5hkti1F1uYoZhP5iyc6GHAU5coKgqq5syLhI,1059
300
300
  uncountable/types/api/uploader/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
301
301
  uncountable/types/api/uploader/invoke_uploader.py,sha256=-loZzBihKqx63eP-f5RuV1mu6tgkRTZmIc545kklZLk,1273
302
- uncountablepythonsdk-0.0.103.dist-info/METADATA,sha256=lPJd1v2DjOMjZNnl8_kF5bho1QcSYA6x5qU-axsTzX8,2112
303
- uncountablepythonsdk-0.0.103.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
304
- uncountablepythonsdk-0.0.103.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
305
- uncountablepythonsdk-0.0.103.dist-info/RECORD,,
302
+ uncountablepythonsdk-0.0.105.dist-info/METADATA,sha256=Oyif_iWvlqiIP3t3_R7wqIyxBgkF3FN_BmVPxUC1MzI,2112
303
+ uncountablepythonsdk-0.0.105.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
304
+ uncountablepythonsdk-0.0.105.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
305
+ uncountablepythonsdk-0.0.105.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5