UncountablePythonSDK 0.0.109__py3-none-any.whl → 0.0.110__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.

@@ -7,6 +7,7 @@ WORK-IN-PROGRESS, DON'T USE!
7
7
  import dataclasses
8
8
  import json
9
9
  import re
10
+ from enum import StrEnum
10
11
  from typing import Collection, assert_never, cast
11
12
 
12
13
  from pkgs.serialization import yaml
@@ -62,6 +63,10 @@ base_name_map = {
62
63
  }
63
64
 
64
65
 
66
+ class OpenAPIDefaultBehavior(StrEnum):
67
+ OPTIONAL_WITH_DEFAULT = "optional_with_default"
68
+
69
+
65
70
  def _rewrite_with_notice(
66
71
  file_path: str, file_content: str, *, notice: str = MODIFY_NOTICE
67
72
  ) -> bool:
@@ -432,6 +437,18 @@ def _emit_namespace(
432
437
  _rewrite_with_notice(path, yaml.dumps(oa_namespace, sort_keys=False))
433
438
 
434
439
 
440
+ def _get_openapi_default_behavior(
441
+ prop: builder.SpecProperty,
442
+ ) -> OpenAPIDefaultBehavior | None:
443
+ if prop.ext_info is None or prop.ext_info.get("open_api") is None:
444
+ return None
445
+ value_passed = prop.ext_info["open_api"].get("default_required_behavior")
446
+ if value_passed is None:
447
+ return None
448
+ assert isinstance(value_passed, str)
449
+ return OpenAPIDefaultBehavior(value_passed)
450
+
451
+
435
452
  def _emit_type(
436
453
  ctx: EmitOpenAPIContext,
437
454
  stype: builder.SpecType,
@@ -495,6 +512,16 @@ def _emit_type(
495
512
  # arguments, thus treat like extant==missing
496
513
  # IMPROVE: if we can decide they are meant as output instead, then
497
514
  # they should be marked as required
515
+ openapi_default_beahvior = _get_openapi_default_behavior(prop)
516
+ match openapi_default_beahvior:
517
+ case None:
518
+ pass
519
+ case OpenAPIDefaultBehavior.OPTIONAL_WITH_DEFAULT:
520
+ ref_type.nullable = True
521
+ assert prop.default is not None, (
522
+ "optional_with_default requires default"
523
+ )
524
+ ref_type.default = prop.default
498
525
  properties[prop_name] = ref_type
499
526
  elif prop.extant == builder.PropertyExtant.missing:
500
527
  # Unlike optional below, missing does not imply null is possible. They
@@ -1,14 +1,23 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from enum import StrEnum
3
3
 
4
+ from pkgs.serialization_util import JsonValue
5
+
4
6
 
5
7
  class OpenAPIType(ABC):
6
8
  description: str | None = None
7
9
  nullable: bool = False
10
+ default: JsonValue
8
11
 
9
- def __init__(self, description: str | None = None, nullable: bool = False) -> None:
12
+ def __init__(
13
+ self,
14
+ description: str | None = None,
15
+ nullable: bool = False,
16
+ default: JsonValue = None,
17
+ ) -> None:
10
18
  self.description = description
11
19
  self.nullable = nullable
20
+ self.default = default
12
21
 
13
22
  @abstractmethod
14
23
  def asdict(self) -> dict[str, object]:
@@ -19,6 +28,8 @@ class OpenAPIType(ABC):
19
28
  emitted["description"] = self.description
20
29
  if self.nullable:
21
30
  emitted["nullable"] = self.nullable
31
+ if self.default is not None:
32
+ emitted["default"] = self.default
22
33
  return emitted
23
34
 
24
35
 
@@ -296,6 +296,21 @@ def _extract_and_validate_layout(
296
296
  return layout
297
297
 
298
298
 
299
+ def _pull_property_from_type_recursively(
300
+ stype: builder.SpecTypeDefnObject,
301
+ property_name: str,
302
+ ) -> builder.SpecProperty | None:
303
+ assert stype.properties is not None
304
+ prop = stype.properties.get(property_name)
305
+ if prop is not None:
306
+ return prop
307
+
308
+ if stype.base is None:
309
+ return None
310
+
311
+ return _pull_property_from_type_recursively(stype.base, property_name)
312
+
313
+
299
314
  def _validate_type_ext_info(
300
315
  stype: builder.SpecTypeDefnObject,
301
316
  ) -> tuple[ExtInfoLayout | None, type_info_t.ExtInfo | None]:
@@ -306,7 +321,7 @@ def _validate_type_ext_info(
306
321
  if ext_info.label_fields is not None:
307
322
  assert stype.properties is not None
308
323
  for name in ext_info.label_fields:
309
- prop = stype.properties.get(name)
324
+ prop = _pull_property_from_type_recursively(stype, name)
310
325
  assert prop is not None, f"missing-label-field:{name}"
311
326
 
312
327
  if not stype.is_base and isinstance(stype.base, builder.SpecTypeDefnObject):
@@ -416,6 +431,8 @@ def _parse_ext_info(in_ext: Any) -> type_info_t.ExtInfo | None:
416
431
  df["result_type"] = serialize_for_storage(converted)
417
432
  mod_ext["data_format"] = df
418
433
 
434
+ if "open_api" in mod_ext:
435
+ del mod_ext["open_api"]
419
436
  return ext_info_parser.parse_storage(mod_ext)
420
437
 
421
438
 
@@ -25,6 +25,7 @@ from .api.recipes import create_recipe as create_recipe_t
25
25
  from .api.recipe_links import create_recipe_link as create_recipe_link_t
26
26
  from .api.recipes import create_recipes as create_recipes_t
27
27
  from . import curves_t as curves_t
28
+ from . import data_t as data_t
28
29
  from .api.recipes import disassociate_recipe_as_input as disassociate_recipe_as_input_t
29
30
  from .api.files import download_file as download_file_t
30
31
  from .api.recipes import edit_recipe_inputs as edit_recipe_inputs_t
@@ -136,6 +137,7 @@ __all__: list[str] = [
136
137
  "create_recipe_link_t",
137
138
  "create_recipes_t",
138
139
  "curves_t",
140
+ "data_t",
139
141
  "disassociate_recipe_as_input_t",
140
142
  "download_file_t",
141
143
  "edit_recipe_inputs_t",
@@ -21,6 +21,7 @@ __all__: list[str] = [
21
21
  "Data",
22
22
  "ENDPOINT_METHOD",
23
23
  "ENDPOINT_PATH",
24
+ "MixStepMatchStrategy",
24
25
  "PlaceholderBase",
25
26
  "PlaceholderDisplayMode",
26
27
  "PlaceholderType",
@@ -58,6 +59,12 @@ class RecipeInputEditType(StrEnum):
58
59
  SET_PLACEHOLDER = "set_placeholder"
59
60
 
60
61
 
62
+ # DO NOT MODIFY -- This file is generated by type_spec
63
+ class MixStepMatchStrategy(StrEnum):
64
+ FIRST = "first"
65
+ LAST = "last"
66
+
67
+
61
68
  # DO NOT MODIFY -- This file is generated by type_spec
62
69
  @serial_class(
63
70
  named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditBase",
@@ -101,6 +108,7 @@ class RecipeInputEditInputBase(RecipeInputEditBase):
101
108
  @dataclasses.dataclass(kw_only=True)
102
109
  class RecipeInputEditChangeBasisViewed(RecipeInputEditInputBase):
103
110
  type: typing.Literal[RecipeInputEditType.CHANGE_BASIS] = RecipeInputEditType.CHANGE_BASIS
111
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
104
112
 
105
113
 
106
114
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -112,6 +120,7 @@ class RecipeInputEditChangeBasisViewed(RecipeInputEditInputBase):
112
120
  class RecipeInputEditUpsertInput(RecipeInputEditInputBase):
113
121
  type: typing.Literal[RecipeInputEditType.UPSERT_INPUT] = RecipeInputEditType.UPSERT_INPUT
114
122
  clear_first: bool
123
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
115
124
 
116
125
 
117
126
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -169,6 +178,7 @@ class RecipeInputEditUpdateAnnotations(RecipeInputEditInputBase):
169
178
  type: typing.Literal[RecipeInputEditType.UPDATE_ANNOTATIONS] = RecipeInputEditType.UPDATE_ANNOTATIONS
170
179
  clear_first: bool
171
180
  annotations: list[AnnotationEdit]
181
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
172
182
 
173
183
 
174
184
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -238,6 +248,7 @@ class RecipeInputEditPlaceholder(RecipeInputEditBase):
238
248
  type: typing.Literal[RecipeInputEditType.SET_PLACEHOLDER] = RecipeInputEditType.SET_PLACEHOLDER
239
249
  ingredient_key: identifier_t.IdentifierKey
240
250
  placeholder: RecipeInputPlaceholder
251
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
241
252
 
242
253
 
243
254
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -10,6 +10,7 @@ from enum import StrEnum
10
10
  import dataclasses
11
11
  from pkgs.serialization import serial_class
12
12
  from ... import base_t
13
+ from ... import data_t
13
14
  from ... import field_values_t
14
15
  from ... import recipes_t
15
16
  from ... import response_t
@@ -59,6 +60,7 @@ class RecipeOutputValue:
59
60
  value_numeric: Decimal | None = None
60
61
  value_str: str | None = None
61
62
  value_curve: CurveValues | None = None
63
+ value_color: data_t.RecipeOutputColor | None = None
62
64
  formatting: recipes_t.RecipeAttributeFormatting | None = None
63
65
  field_values: list[field_values_t.ArgumentValueRefName | field_values_t.ArgumentValueId] | None = None
64
66
 
@@ -41,6 +41,7 @@ class AsyncBatchRequestPath(StrEnum):
41
41
  CREATE_OR_UPDATE_ENTITY = "entity/create_or_update_entity"
42
42
  ADD_TIME_SERIES_DATA = "recipes/add_time_series_data"
43
43
  LOOKUP_ENTITY = "entity/lookup_entity"
44
+ CREATE_RECIPE_LINK = "recipe_links/create_recipe_link"
44
45
 
45
46
 
46
47
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,12 @@
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 .data_t import RgbColor as RgbColor
7
+ from .data_t import CielabColor as CielabColor
8
+ from .data_t import XyzColor as XyzColor
9
+ from .data_t import LChColor as LChColor
10
+ from .data_t import HslColor as HslColor
11
+ from .data_t import RecipeOutputColor as RecipeOutputColor
12
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,93 @@
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
+
12
+ __all__: list[str] = [
13
+ "CielabColor",
14
+ "HslColor",
15
+ "LChColor",
16
+ "RecipeOutputColor",
17
+ "RgbColor",
18
+ "XyzColor",
19
+ ]
20
+
21
+
22
+ # DO NOT MODIFY -- This file is generated by type_spec
23
+ @serial_class(
24
+ named_type_path="sdk.data.RgbColor",
25
+ unconverted_keys={"B", "G", "R"},
26
+ )
27
+ @dataclasses.dataclass(kw_only=True)
28
+ class RgbColor:
29
+ R: int
30
+ G: int
31
+ B: int
32
+
33
+
34
+ # DO NOT MODIFY -- This file is generated by type_spec
35
+ @serial_class(
36
+ named_type_path="sdk.data.CielabColor",
37
+ unconverted_keys={"L", "a", "b"},
38
+ )
39
+ @dataclasses.dataclass(kw_only=True)
40
+ class CielabColor:
41
+ L: int
42
+ a: int
43
+ b: int
44
+
45
+
46
+ # DO NOT MODIFY -- This file is generated by type_spec
47
+ @serial_class(
48
+ named_type_path="sdk.data.XyzColor",
49
+ unconverted_keys={"X", "Y", "Z"},
50
+ )
51
+ @dataclasses.dataclass(kw_only=True)
52
+ class XyzColor:
53
+ X: int
54
+ Y: int
55
+ Z: int
56
+
57
+
58
+ # DO NOT MODIFY -- This file is generated by type_spec
59
+ @serial_class(
60
+ named_type_path="sdk.data.LChColor",
61
+ unconverted_keys={"C", "L", "h"},
62
+ )
63
+ @dataclasses.dataclass(kw_only=True)
64
+ class LChColor:
65
+ L: int
66
+ C: int
67
+ h: int
68
+
69
+
70
+ # DO NOT MODIFY -- This file is generated by type_spec
71
+ @serial_class(
72
+ named_type_path="sdk.data.HslColor",
73
+ unconverted_keys={"L", "h", "s"},
74
+ )
75
+ @dataclasses.dataclass(kw_only=True)
76
+ class HslColor:
77
+ h: int
78
+ s: int
79
+ L: int
80
+
81
+
82
+ # DO NOT MODIFY -- This file is generated by type_spec
83
+ @serial_class(
84
+ named_type_path="sdk.data.RecipeOutputColor",
85
+ unconverted_keys={"CIELAB", "LCH", "RGB", "XYZ"},
86
+ )
87
+ @dataclasses.dataclass(kw_only=True)
88
+ class RecipeOutputColor:
89
+ RGB: RgbColor
90
+ CIELAB: CielabColor
91
+ XYZ: XyzColor | None = None
92
+ LCH: LChColor | None = None
93
+ # 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.109
3
+ Version: 0.0.110
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
@@ -63,13 +63,13 @@ pkgs/type_spec/builder.py,sha256=6m9sWeap0Hh8LkcQpufO5mkFRNIFIBKhEA02Q23PrSs,530
63
63
  pkgs/type_spec/config.py,sha256=K6WebgeI3Saew0IEBcm1s2fauw_CyvH183emVrNoUXg,5327
64
64
  pkgs/type_spec/cross_output_links.py,sha256=bVNn0a4LMVTRLg_zjtiHnoTwdINHfftjWoH6tGdxhlk,3124
65
65
  pkgs/type_spec/emit_io_ts.py,sha256=CUvBs0boB_X-Kndh66yYcqFfq3oC_LGs8YffLkJ0ZXA,5707
66
- pkgs/type_spec/emit_open_api.py,sha256=kHP4jKRica4Us28_9G2iHq9K7BrUdsl8daIIHZaPdws,25000
66
+ pkgs/type_spec/emit_open_api.py,sha256=B9cGFR7TU90_yky-HdNq1sDIJOuP3eU4o3j7nNgIpkU,26047
67
67
  pkgs/type_spec/emit_open_api_util.py,sha256=xnc4ymNzEyAS1Q2cV6Ma9Y6mQ1MbPPi2WaHKTSFETr8,2346
68
68
  pkgs/type_spec/emit_python.py,sha256=8Nzu6uk9ofezWcrcaVU0wPHCIM8DwvXnronrIDLP6yg,52403
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
72
- pkgs/type_spec/open_api_util.py,sha256=OiuMWUIwi7ibIOABtuHnhrPdfd3rVxv0MJ1ZY1xj_qw,7083
72
+ pkgs/type_spec/open_api_util.py,sha256=DYnlygaMIqDQtSuYpUpd5lpA9JG4JHd_-iGe-BY2lhw,7333
73
73
  pkgs/type_spec/test.py,sha256=4ueujBq-pEgnX3Z69HyPmD-bullFXmpixcpVzfOkhP4,489
74
74
  pkgs/type_spec/util.py,sha256=S_SGTJU192x-wIbngVUTvXhQENMbBfxluigLmnItGI8,4848
75
75
  pkgs/type_spec/actions_registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -78,7 +78,7 @@ pkgs/type_spec/actions_registry/emit_typescript.py,sha256=W1lI36ITdJ7MBf37wlTB7H
78
78
  pkgs/type_spec/parts/base.py.prepart,sha256=RDNNo4nbLiC9ASIODq2xIt0HkwDNiJVcmjDD33Bubaw,2303
79
79
  pkgs/type_spec/parts/base.ts.prepart,sha256=2FJJvpg2olCcavxj0nbYWdwKl6KeScour2JjSvN42l8,1001
80
80
  pkgs/type_spec/type_info/__main__.py,sha256=TLNvCHGcmaj_8Sj5bAQNpuNaaw2dpDzoFDWZds0V4Qo,1002
81
- pkgs/type_spec/type_info/emit_type_info.py,sha256=XB6pU3FJ32MkddPky3NDUGiA8jsjW6knG04X0Cv84bM,14490
81
+ pkgs/type_spec/type_info/emit_type_info.py,sha256=ON5L-MopmCjIEBm9K5xN3lJmDG1leFxuCLU_bg5W-RM,14972
82
82
  pkgs/type_spec/value_spec/__init__.py,sha256=Z-grlcZtxAfEXhPHsK0nD7PFLGsv4eqvunaPN7_TA84,83
83
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
@@ -130,10 +130,10 @@ uncountable/integration/queue_runner/datastore/model.py,sha256=8-RI5A2yPZVGBLWIN
130
130
  uncountable/integration/secret_retrieval/__init__.py,sha256=3QXVj35w8rRMxVvmmsViFYDi3lcb3g70incfalOEm6o,87
131
131
  uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=9iz9N8Z-B68QwFCXsx8hTYbgDbk06ejkJ3RQ9mCLMyM,3000
132
132
  uncountable/integration/webhook_server/entrypoint.py,sha256=yQWQq_k3kbJkSsEEt6k22YwhXekezJZfV0rnn-hP-Yo,5516
133
- uncountable/types/__init__.py,sha256=a2kCvZBwEAFM3OaadEAZ2bugCLt5XF3-jtMv1fnQLQw,9488
133
+ uncountable/types/__init__.py,sha256=E5rw-DgsM0S8kx-UO1q1qoUeiFg7GcfuSe_IcniEp8s,9533
134
134
  uncountable/types/async_batch.py,sha256=yCCWrrLQfxXVqZp-KskxLBNkNmuELdz4PJjx8ULppgs,662
135
135
  uncountable/types/async_batch_processor.py,sha256=zko4MIgYSfV0bh46jyUBYVGbUQUxTESajGH7hAFUlCg,17912
136
- uncountable/types/async_batch_t.py,sha256=imFU0INA-LAGYXDhwlWWTVxfGizmDOYZwUs7BgqFzpA,3229
136
+ uncountable/types/async_batch_t.py,sha256=8DH-_5W3AI4dYn-FxTn060isHFOTJb1JKwDrfBztyC4,3288
137
137
  uncountable/types/async_jobs.py,sha256=JI0ScfawaqMRbJ2jbgW3YQLhijPnBeYdMnZJjygSxHg,322
138
138
  uncountable/types/async_jobs_t.py,sha256=u4xd3i512PZ-9592Q2ZgWh_faMiI4UMm0F_gOmZnerI,1389
139
139
  uncountable/types/auth_retrieval.py,sha256=770zjN1K9EF5zs1Xml7x6ke6Hkze7rcMT5FdDVCIl9M,549
@@ -149,6 +149,8 @@ uncountable/types/client_config.py,sha256=qLpHt4O_B098CyN6qQajoxZ2zjZ1DILXLUEGyy
149
149
  uncountable/types/client_config_t.py,sha256=k_UkjemqiVuJBiFUjJYk3h673Nahr0nGZvfEZFzsC0k,699
150
150
  uncountable/types/curves.py,sha256=QyEyC20jsG-LGKVx6miiF-w70vKMwNkILFBDIJ5Ok9g,345
151
151
  uncountable/types/curves_t.py,sha256=2_9qdrSl1XAvIG57lo45KWNpa0wXgZ97OkSRCPRrudc,1347
152
+ uncountable/types/data.py,sha256=6dChU1uzwHT8xN2AFbMaAW41RV53b1_hLWuGny4EiMA,478
153
+ uncountable/types/data_t.py,sha256=nfaV6q-RJWxXGAY4wmvT06Hj51-AfyDU61mHFV08IOc,2043
152
154
  uncountable/types/entity.py,sha256=Zclk1LYcRaYrMDhqyCjMSLEg0fE6_q8LHvV22Qvscgs,566
153
155
  uncountable/types/entity_t.py,sha256=vOin1nE84-QNDGeICJk1B0Rx5ZJQpADLsiUodM_W-7g,19595
154
156
  uncountable/types/experiment_groups.py,sha256=qUpFOx1AKgzaT_4khCOv5Xs6jwiQGbvHH-GUh3v1nv4,288
@@ -277,7 +279,7 @@ uncountable/types/api/recipes/clear_recipe_outputs.py,sha256=BfTQrV79UePkJ4HSSix
277
279
  uncountable/types/api/recipes/create_recipe.py,sha256=tVeQgikCWAwGtxpq2vLyXd5Aeqo_8Tde64x5GAOJl50,1472
278
280
  uncountable/types/api/recipes/create_recipes.py,sha256=J1CBE13d8JaVpUxOftFg1Plo8RKa0vc-A2nHdO1yoj8,1862
279
281
  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
282
+ uncountable/types/api/recipes/edit_recipe_inputs.py,sha256=Zpz72b-LEfNpyCsWZv0kg3hRhjipWdoyU9JRkwRHnHc,10313
281
283
  uncountable/types/api/recipes/get_column_calculation_values.py,sha256=9eqURjD2Mwm2lyV1bJIq66Z7a3enLhhx_scZBt4SYYc,1671
282
284
  uncountable/types/api/recipes/get_curve.py,sha256=C-elYAKcBw7P5bWwN-8p_SWj15l5aBJrKNR8yjphZ-Q,1085
283
285
  uncountable/types/api/recipes/get_recipe_calculations.py,sha256=iBmkhKC1qBFxuPPziM3LD6tGsdsN_xb4NcUaJwF6cHU,1679
@@ -291,7 +293,7 @@ uncountable/types/api/recipes/set_recipe_inputs.py,sha256=RvWj2SOtcuy_msp9pUjz20
291
293
  uncountable/types/api/recipes/set_recipe_metadata.py,sha256=R4GVqpMJdJuoSXsJx1e4vhmWqKKTPMyPPEArwV45crI,1104
292
294
  uncountable/types/api/recipes/set_recipe_output_annotations.py,sha256=yczFBmuB0grzNWsnXspCPUsDA608M9wGkJ2dugyxG4U,3526
293
295
  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
296
+ uncountable/types/api/recipes/set_recipe_outputs.py,sha256=-dwyNp614V7lnUc0dANooy92mgbZ7wgUP3CbnitHDvY,2445
295
297
  uncountable/types/api/recipes/set_recipe_tags.py,sha256=HS5GG-nTy0vTNTANG-ROawku0VhzOs0hIzGKfRFefYY,3098
296
298
  uncountable/types/api/recipes/unarchive_recipes.py,sha256=G0jYuarNZLmTCQ6m5_ZAUwBl4M8_cqKRlP-jMJp-Rcw,1000
297
299
  uncountable/types/api/recipes/unlock_recipes.py,sha256=QFvz13eJipWQlIRrqOybnIPeJxfR4yZM8yIr841jd28,1258
@@ -299,7 +301,7 @@ uncountable/types/api/triggers/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr
299
301
  uncountable/types/api/triggers/run_trigger.py,sha256=diX1ix_5hkti1F1uYoZhP5iyc6GHAU5coKgqq5syLhI,1059
300
302
  uncountable/types/api/uploader/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
301
303
  uncountable/types/api/uploader/invoke_uploader.py,sha256=-loZzBihKqx63eP-f5RuV1mu6tgkRTZmIc545kklZLk,1273
302
- uncountablepythonsdk-0.0.109.dist-info/METADATA,sha256=4r1nvHGuWQfdkmddOCwPER5Y_apU2bB2T10w5cyr1xs,2112
303
- uncountablepythonsdk-0.0.109.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
304
- uncountablepythonsdk-0.0.109.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
305
- uncountablepythonsdk-0.0.109.dist-info/RECORD,,
304
+ uncountablepythonsdk-0.0.110.dist-info/METADATA,sha256=o-jC36duA9dF3twDaf-7a1UY5XgfAGbcT7J_PYyw_L4,2112
305
+ uncountablepythonsdk-0.0.110.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
306
+ uncountablepythonsdk-0.0.110.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
307
+ uncountablepythonsdk-0.0.110.dist-info/RECORD,,