UncountablePythonSDK 0.0.101__py3-none-any.whl → 0.0.104__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 (38) hide show
  1. docs/justfile +2 -2
  2. examples/integration-server/jobs/materials_auto/example_wh.py +4 -0
  3. examples/integration-server/pyproject.toml +4 -4
  4. pkgs/argument_parser/__init__.py +1 -0
  5. pkgs/argument_parser/argument_parser.py +30 -20
  6. pkgs/serialization/serial_class.py +21 -10
  7. pkgs/type_spec/builder.py +3 -7
  8. pkgs/type_spec/config.py +5 -1
  9. pkgs/type_spec/emit_open_api.py +23 -13
  10. pkgs/type_spec/emit_open_api_util.py +0 -1
  11. pkgs/type_spec/emit_python.py +13 -1
  12. pkgs/type_spec/type_info/__main__.py +3 -1
  13. pkgs/type_spec/type_info/emit_type_info.py +34 -5
  14. uncountable/core/client.py +2 -2
  15. uncountable/integration/telemetry.py +1 -1
  16. uncountable/types/__init__.py +4 -0
  17. uncountable/types/api/entity/lookup_entity.py +100 -0
  18. uncountable/types/api/recipes/add_time_series_data.py +64 -0
  19. uncountable/types/api/recipes/edit_recipe_inputs.py +2 -0
  20. uncountable/types/api/recipes/get_recipe_links.py +1 -0
  21. uncountable/types/api/recipes/lock_recipes.py +1 -0
  22. uncountable/types/api/recipes/set_recipe_outputs.py +10 -0
  23. uncountable/types/api/recipes/unlock_recipes.py +1 -0
  24. uncountable/types/async_batch_processor.py +34 -0
  25. uncountable/types/async_batch_t.py +2 -0
  26. uncountable/types/client_base.py +26 -0
  27. uncountable/types/client_config_t.py +1 -0
  28. uncountable/types/entity_t.py +5 -1
  29. uncountable/types/field_values.py +4 -0
  30. uncountable/types/field_values_t.py +50 -1
  31. uncountable/types/generic_upload_t.py +1 -0
  32. uncountable/types/job_definition_t.py +2 -0
  33. uncountable/types/recipe_workflow_steps_t.py +1 -0
  34. uncountable/types/response_t.py +1 -0
  35. {UncountablePythonSDK-0.0.101.dist-info → uncountablepythonsdk-0.0.104.dist-info}/METADATA +2 -2
  36. {UncountablePythonSDK-0.0.101.dist-info → uncountablepythonsdk-0.0.104.dist-info}/RECORD +38 -36
  37. {UncountablePythonSDK-0.0.101.dist-info → uncountablepythonsdk-0.0.104.dist-info}/WHEEL +1 -1
  38. {UncountablePythonSDK-0.0.101.dist-info → uncountablepythonsdk-0.0.104.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,100 @@
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 pkgs.serialization import serial_union_annotation
13
+ from ... import async_batch_t
14
+ from ... import base_t
15
+ from ... import entity_t
16
+ from ... import identifier_t
17
+
18
+ __all__: list[str] = [
19
+ "Arguments",
20
+ "Data",
21
+ "ENDPOINT_METHOD",
22
+ "ENDPOINT_PATH",
23
+ "LookupEntityFieldValue",
24
+ "LookupEntityQuery",
25
+ "LookupEntityQueryBase",
26
+ "LookupEntityQueryType",
27
+ "LookupFieldArgumentValue",
28
+ ]
29
+
30
+ ENDPOINT_METHOD = "GET"
31
+ ENDPOINT_PATH = "api/external/entity/lookup_entity"
32
+
33
+
34
+ # DO NOT MODIFY -- This file is generated by type_spec
35
+ class LookupEntityQueryType(StrEnum):
36
+ FIELD_VALUE = "field_value"
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @serial_class(
41
+ named_type_path="sdk.api.entity.lookup_entity.LookupEntityQueryBase",
42
+ )
43
+ @dataclasses.dataclass(kw_only=True)
44
+ class LookupEntityQueryBase:
45
+ type: LookupEntityQueryType
46
+
47
+
48
+ # DO NOT MODIFY -- This file is generated by type_spec
49
+ @serial_class(
50
+ named_type_path="sdk.api.entity.lookup_entity.LookupFieldArgumentValue",
51
+ unconverted_values={"field_value"},
52
+ )
53
+ @dataclasses.dataclass(kw_only=True)
54
+ class LookupFieldArgumentValue:
55
+ field_key: identifier_t.IdentifierKey
56
+ field_value: base_t.JsonValue
57
+
58
+
59
+ # DO NOT MODIFY -- This file is generated by type_spec
60
+ @serial_class(
61
+ named_type_path="sdk.api.entity.lookup_entity.LookupEntityFieldValue",
62
+ parse_require={"type"},
63
+ )
64
+ @dataclasses.dataclass(kw_only=True)
65
+ class LookupEntityFieldValue:
66
+ type: typing.Literal[LookupEntityQueryType.FIELD_VALUE] = LookupEntityQueryType.FIELD_VALUE
67
+ value: LookupFieldArgumentValue
68
+
69
+
70
+ # DO NOT MODIFY -- This file is generated by type_spec
71
+ LookupEntityQuery = typing.Annotated[
72
+ typing.Union[LookupEntityFieldValue],
73
+ serial_union_annotation(
74
+ named_type_path="sdk.api.entity.lookup_entity.LookupEntityQuery",
75
+ discriminator="type",
76
+ discriminator_map={
77
+ "field_value": LookupEntityFieldValue,
78
+ },
79
+ ),
80
+ ]
81
+
82
+
83
+ # DO NOT MODIFY -- This file is generated by type_spec
84
+ @serial_class(
85
+ named_type_path="sdk.api.entity.lookup_entity.Arguments",
86
+ )
87
+ @dataclasses.dataclass(kw_only=True)
88
+ class Arguments:
89
+ entity_type: entity_t.EntityType
90
+ query: LookupEntityQuery
91
+
92
+
93
+ # DO NOT MODIFY -- This file is generated by type_spec
94
+ @serial_class(
95
+ named_type_path="sdk.api.entity.lookup_entity.Data",
96
+ )
97
+ @dataclasses.dataclass(kw_only=True)
98
+ class Data(async_batch_t.AsyncBatchActionReturn):
99
+ pass
100
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,64 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import async_batch_t
13
+ from ... import identifier_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ "OnTimepointConflict",
21
+ "TimeSeriesDatum",
22
+ ]
23
+
24
+ ENDPOINT_METHOD = "POST"
25
+ ENDPOINT_PATH = "api/external/recipes/external_add_time_series_data"
26
+
27
+
28
+ # DO NOT MODIFY -- This file is generated by type_spec
29
+ class OnTimepointConflict(StrEnum):
30
+ OVERWRITE = "overwrite"
31
+ ERROR = "error"
32
+
33
+
34
+ # DO NOT MODIFY -- This file is generated by type_spec
35
+ @serial_class(
36
+ named_type_path="sdk.api.recipes.add_time_series_data.TimeSeriesDatum",
37
+ to_string_values={"value"},
38
+ )
39
+ @dataclasses.dataclass(kw_only=True)
40
+ class TimeSeriesDatum:
41
+ timestamp: datetime.datetime
42
+ value: Decimal | None = None
43
+
44
+
45
+ # DO NOT MODIFY -- This file is generated by type_spec
46
+ @serial_class(
47
+ named_type_path="sdk.api.recipes.add_time_series_data.Arguments",
48
+ explicit_defaults={"on_conflict"},
49
+ )
50
+ @dataclasses.dataclass(kw_only=True)
51
+ class Arguments:
52
+ time_series_segment_key: identifier_t.IdentifierKey
53
+ time_series_data: list[TimeSeriesDatum]
54
+ on_conflict: OnTimepointConflict = OnTimepointConflict.ERROR
55
+
56
+
57
+ # DO NOT MODIFY -- This file is generated by type_spec
58
+ @serial_class(
59
+ named_type_path="sdk.api.recipes.add_time_series_data.Data",
60
+ )
61
+ @dataclasses.dataclass(kw_only=True)
62
+ class Data(async_batch_t.AsyncBatchActionReturn):
63
+ pass
64
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -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:
@@ -6,6 +6,7 @@ from __future__ import annotations
6
6
  import typing # noqa: F401
7
7
  import datetime # noqa: F401
8
8
  from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
9
10
  import dataclasses
10
11
  from pkgs.serialization import serial_class
11
12
  from ... import base_t
@@ -19,6 +20,7 @@ __all__: list[str] = [
19
20
  "Data",
20
21
  "ENDPOINT_METHOD",
21
22
  "ENDPOINT_PATH",
23
+ "NullBehavior",
22
24
  "RecipeOutputValue",
23
25
  ]
24
26
 
@@ -36,16 +38,24 @@ class CurveValues:
36
38
  y_values: list[Decimal | None]
37
39
 
38
40
 
41
+ # DO NOT MODIFY -- This file is generated by type_spec
42
+ class NullBehavior(StrEnum):
43
+ DO_NOTHING = "do_nothing"
44
+ ENSURE_EXISTS = "ensure_exists"
45
+
46
+
39
47
  # DO NOT MODIFY -- This file is generated by type_spec
40
48
  @serial_class(
41
49
  named_type_path="sdk.api.recipes.set_recipe_outputs.RecipeOutputValue",
42
50
  to_string_values={"value_numeric"},
51
+ explicit_defaults={"null_behavior"},
43
52
  )
44
53
  @dataclasses.dataclass(kw_only=True)
45
54
  class RecipeOutputValue:
46
55
  recipe_id: base_t.ObjectId
47
56
  output_id: base_t.ObjectId
48
57
  experiment_num: int
58
+ null_behavior: NullBehavior | None = NullBehavior.DO_NOTHING
49
59
  condition_id: base_t.ObjectId | None = None
50
60
  value_numeric: Decimal | None = None
51
61
  value_str: str | None = None
@@ -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:
@@ -22,6 +22,7 @@ from uncountable.types import generic_upload_t
22
22
  import uncountable.types.api.entity.grant_entity_permissions as grant_entity_permissions_t
23
23
  from uncountable.types import identifier_t
24
24
  import uncountable.types.api.uploader.invoke_uploader as invoke_uploader_t
25
+ import uncountable.types.api.entity.lookup_entity as lookup_entity_t
25
26
  from uncountable.types import recipe_identifiers_t
26
27
  from uncountable.types import recipe_metadata_t
27
28
  from uncountable.types import recipe_workflow_steps_t
@@ -386,6 +387,39 @@ class AsyncBatchProcessorBase(ABC):
386
387
  batch_reference=req.batch_reference,
387
388
  )
388
389
 
390
+ def lookup_entity(
391
+ self,
392
+ *,
393
+ entity_type: entity_t.EntityType,
394
+ query: lookup_entity_t.LookupEntityQuery,
395
+ depends_on: list[str] | None = None,
396
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
397
+ """Look up an entity based on an identifier or field values
398
+
399
+ :param depends_on: A list of batch reference keys to process before processing this request
400
+ """
401
+ args = lookup_entity_t.Arguments(
402
+ entity_type=entity_type,
403
+ query=query,
404
+ )
405
+ json_data = serialize_for_api(args)
406
+
407
+ batch_reference = str(uuid.uuid4())
408
+
409
+ req = async_batch_t.AsyncBatchRequest(
410
+ path=async_batch_t.AsyncBatchRequestPath.LOOKUP_ENTITY,
411
+ data=json_data,
412
+ depends_on=depends_on,
413
+ batch_reference=batch_reference,
414
+ )
415
+
416
+ self._enqueue(req)
417
+
418
+ return async_batch_t.QueuedAsyncBatchRequest(
419
+ path=req.path,
420
+ batch_reference=req.batch_reference,
421
+ )
422
+
389
423
  def set_entity_field_values(
390
424
  self,
391
425
  *,
@@ -39,6 +39,8 @@ class AsyncBatchRequestPath(StrEnum):
39
39
  SET_ENTITY_FIELD_VALUES = "entity/set_entity_field_values"
40
40
  ASSOCIATE_RECIPE_AS_LOT = "recipes/associate_recipe_as_lot"
41
41
  CREATE_OR_UPDATE_ENTITY = "entity/create_or_update_entity"
42
+ ADD_TIME_SERIES_DATA = "recipes/add_time_series_data"
43
+ LOOKUP_ENTITY = "entity/lookup_entity"
42
44
 
43
45
 
44
46
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -9,6 +9,7 @@ import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
10
  from pkgs.serialization import OpaqueKey
11
11
  import uncountable.types.api.recipes.add_recipe_to_project as add_recipe_to_project_t
12
+ import uncountable.types.api.recipes.add_time_series_data as add_time_series_data_t
12
13
  import uncountable.types.api.recipes.archive_recipes as archive_recipes_t
13
14
  import uncountable.types.api.equipment.associate_equipment_input as associate_equipment_input_t
14
15
  import uncountable.types.api.recipes.associate_recipe_as_input as associate_recipe_as_input_t
@@ -128,6 +129,31 @@ class ClientMethods(ABC):
128
129
  )
129
130
  return self.do_request(api_request=api_request, return_type=add_recipe_to_project_t.Data)
130
131
 
132
+ def external_add_time_series_data(
133
+ self,
134
+ *,
135
+ time_series_segment_key: identifier_t.IdentifierKey,
136
+ time_series_data: list[add_time_series_data_t.TimeSeriesDatum],
137
+ on_conflict: add_time_series_data_t.OnTimepointConflict = add_time_series_data_t.OnTimepointConflict.ERROR,
138
+ ) -> add_time_series_data_t.Data:
139
+ """Add timepoint data to a time series segment.
140
+
141
+ :param time_series_segment_key: The time series segment to add data to
142
+ :param time_series_data: The data to add to the time series segment
143
+ :param on_conflict: What to do if a TimeSeriesDatum already exists at the same timestamp
144
+ """
145
+ args = add_time_series_data_t.Arguments(
146
+ time_series_segment_key=time_series_segment_key,
147
+ time_series_data=time_series_data,
148
+ on_conflict=on_conflict,
149
+ )
150
+ api_request = APIRequest(
151
+ method=add_time_series_data_t.ENDPOINT_METHOD,
152
+ endpoint=add_time_series_data_t.ENDPOINT_PATH,
153
+ args=args,
154
+ )
155
+ return self.do_request(api_request=api_request, return_type=add_time_series_data_t.Data)
156
+
131
157
  def archive_recipes(
132
158
  self,
133
159
  *,
@@ -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:
@@ -49,6 +49,7 @@ __all__: list[str] = [
49
49
  "doe_run": "Suggest Experiments",
50
50
  "email_record_external": "External Emails",
51
51
  "email_relay_server": "Email Relay Server",
52
+ "enter_measurement_view_preference": "Enter Measurement View Preference",
52
53
  "enter_recipe_view_preference": "Enter Experiment View Preference",
53
54
  "entities_viewed": "Entities Viewed",
54
55
  "entity_annotation": "Annotation",
@@ -150,6 +151,7 @@ __all__: list[str] = [
150
151
  "task": "Task",
151
152
  "task_board": "Task Board",
152
153
  "template": "Template",
154
+ "time_series_segment": "Time Series Segment",
153
155
  "timesheet_entry": "Timesheet Entry",
154
156
  "training_run": "Analyze Experiment",
155
157
  "training_run_template": "Scheduled Training Run",
@@ -208,6 +210,7 @@ class EntityType(StrEnum):
208
210
  DOE_RUN = "doe_run"
209
211
  EMAIL_RECORD_EXTERNAL = "email_record_external"
210
212
  EMAIL_RELAY_SERVER = "email_relay_server"
213
+ ENTER_MEASUREMENT_VIEW_PREFERENCE = "enter_measurement_view_preference"
211
214
  ENTER_RECIPE_VIEW_PREFERENCE = "enter_recipe_view_preference"
212
215
  ENTITIES_VIEWED = "entities_viewed"
213
216
  ENTITY_ANNOTATION = "entity_annotation"
@@ -309,6 +312,7 @@ class EntityType(StrEnum):
309
312
  TASK = "task"
310
313
  TASK_BOARD = "task_board"
311
314
  TEMPLATE = "template"
315
+ TIME_SERIES_SEGMENT = "time_series_segment"
312
316
  TIMESHEET_ENTRY = "timesheet_entry"
313
317
  TRAINING_RUN = "training_run"
314
318
  TRAINING_RUN_TEMPLATE = "training_run_template"
@@ -346,7 +350,7 @@ class EntityType(StrEnum):
346
350
 
347
351
  # DO NOT MODIFY -- This file is generated by type_spec
348
352
  LimitedEntityType = typing.Annotated[
349
- 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],
353
+ 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],
350
354
  serial_alias_annotation(
351
355
  named_type_path="sdk.entity.LimitedEntityType",
352
356
  ),
@@ -10,12 +10,16 @@ from .field_values_t import ArgumentValueId as ArgumentValueId
10
10
  from .field_values_t import FieldValueType as FieldValueType
11
11
  from .field_values_t import FieldValueBase as FieldValueBase
12
12
  from .field_values_t import FieldValueFiles as FieldValueFiles
13
+ from .field_values_t import ValueResolution as ValueResolution
14
+ from .field_values_t import FieldValueFieldOption as FieldValueFieldOption
15
+ from .field_values_t import FieldValueFieldOptions as FieldValueFieldOptions
13
16
  from .field_values_t import FieldValueId as FieldValueId
14
17
  from .field_values_t import FieldValueIds as FieldValueIds
15
18
  from .field_values_t import FieldValueText as FieldValueText
16
19
  from .field_values_t import FieldValueBoolean as FieldValueBoolean
17
20
  from .field_values_t import FieldValueNumeric as FieldValueNumeric
18
21
  from .field_values_t import FieldValueBatchReference as FieldValueBatchReference
22
+ from .field_values_t import FieldValueNull as FieldValueNull
19
23
  from .field_values_t import FieldValue as FieldValue
20
24
  from .field_values_t import FieldArgumentValue as FieldArgumentValue
21
25
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -24,12 +24,16 @@ __all__: list[str] = [
24
24
  "FieldValueBase",
25
25
  "FieldValueBatchReference",
26
26
  "FieldValueBoolean",
27
+ "FieldValueFieldOption",
28
+ "FieldValueFieldOptions",
27
29
  "FieldValueFiles",
28
30
  "FieldValueId",
29
31
  "FieldValueIds",
32
+ "FieldValueNull",
30
33
  "FieldValueNumeric",
31
34
  "FieldValueText",
32
35
  "FieldValueType",
36
+ "ValueResolution",
33
37
  ]
34
38
 
35
39
 
@@ -91,6 +95,9 @@ class FieldValueType(StrEnum):
91
95
  BOOLEAN = "boolean"
92
96
  NUMERIC = "numeric"
93
97
  BATCH_REFERENCE = "batch_reference"
98
+ FIELD_OPTION = "field_option"
99
+ FIELD_OPTIONS = "field_options"
100
+ NULL_VALUE = "null_value"
94
101
 
95
102
 
96
103
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -113,6 +120,38 @@ class FieldValueFiles(FieldValueBase):
113
120
  file_ids: list[base_t.ObjectId]
114
121
 
115
122
 
123
+ # DO NOT MODIFY -- This file is generated by type_spec
124
+ class ValueResolution(StrEnum):
125
+ DIRECT = "direct"
126
+ LABEL = "label"
127
+
128
+
129
+ # DO NOT MODIFY -- This file is generated by type_spec
130
+ @serial_class(
131
+ named_type_path="sdk.field_values.FieldValueFieldOption",
132
+ parse_require={"type"},
133
+ explicit_defaults={"value_resolution"},
134
+ )
135
+ @dataclasses.dataclass(kw_only=True)
136
+ class FieldValueFieldOption(FieldValueBase):
137
+ type: typing.Literal[FieldValueType.FIELD_OPTION] = FieldValueType.FIELD_OPTION
138
+ value: str
139
+ value_resolution: ValueResolution = ValueResolution.DIRECT
140
+
141
+
142
+ # DO NOT MODIFY -- This file is generated by type_spec
143
+ @serial_class(
144
+ named_type_path="sdk.field_values.FieldValueFieldOptions",
145
+ parse_require={"type"},
146
+ explicit_defaults={"value_resolution"},
147
+ )
148
+ @dataclasses.dataclass(kw_only=True)
149
+ class FieldValueFieldOptions(FieldValueBase):
150
+ type: typing.Literal[FieldValueType.FIELD_OPTIONS] = FieldValueType.FIELD_OPTIONS
151
+ value: list[str]
152
+ value_resolution: ValueResolution = ValueResolution.DIRECT
153
+
154
+
116
155
  # DO NOT MODIFY -- This file is generated by type_spec
117
156
  @serial_class(
118
157
  named_type_path="sdk.field_values.FieldValueId",
@@ -183,9 +222,19 @@ class FieldValueBatchReference(FieldValueBase):
183
222
  data_key: str
184
223
 
185
224
 
225
+ # DO NOT MODIFY -- This file is generated by type_spec
226
+ @serial_class(
227
+ named_type_path="sdk.field_values.FieldValueNull",
228
+ parse_require={"type"},
229
+ )
230
+ @dataclasses.dataclass(kw_only=True)
231
+ class FieldValueNull(FieldValueBase):
232
+ type: typing.Literal[FieldValueType.NULL_VALUE] = FieldValueType.NULL_VALUE
233
+
234
+
186
235
  # DO NOT MODIFY -- This file is generated by type_spec
187
236
  FieldValue = typing.Annotated[
188
- FieldValueFiles | FieldValueId | FieldValueIds | FieldValueText | FieldValueBoolean | FieldValueNumeric | FieldValueBatchReference,
237
+ FieldValueFiles | FieldValueId | FieldValueIds | FieldValueText | FieldValueBoolean | FieldValueNumeric | FieldValueBatchReference | FieldValueFieldOption | FieldValueFieldOptions | FieldValueNull,
189
238
  serial_union_annotation(
190
239
  named_type_path="sdk.field_values.FieldValue",
191
240
  ),
@@ -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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.101
3
+ Version: 0.0.104
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
@@ -38,7 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.67.1
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
- Requires-Dist: boto3-stubs[essential,ses]==1.36.4
41
+ Requires-Dist: boto3-stubs[essential,ses]==1.*
42
42
  Provides-Extra: test
43
43
  Requires-Dist: mypy==1.*; extra == "test"
44
44
  Requires-Dist: ruff==0.*; extra == "test"