UncountablePythonSDK 0.0.161__py3-none-any.whl → 0.0.162__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.
@@ -2,6 +2,7 @@
2
2
  # ruff: noqa: E402 Q003
3
3
  # fmt: off
4
4
  # isort: skip_file
5
+ from .api.file_folders import add_file_to_folder as add_file_to_folder_t
5
6
  from .api.notebooks import add_notebook_content as add_notebook_content_t
6
7
  from .api.recipes import add_recipe_to_project as add_recipe_to_project_t
7
8
  from .api.recipes import add_time_series_data as add_time_series_data_t
@@ -22,7 +23,6 @@ from .api.runsheet import complete_async_upload as complete_async_upload_t
22
23
  from .api.chemical import convert_chemical_formats as convert_chemical_formats_t
23
24
  from .api.entity import create_entities as create_entities_t
24
25
  from .api.entity import create_entity as create_entity_t
25
- from .api.files import create_file_record as create_file_record_t
26
26
  from .api.inputs import create_inputs as create_inputs_t
27
27
  from .api.recipes import create_mix_order as create_mix_order_t
28
28
  from .api.entity import create_or_update_entity as create_or_update_entity_t
@@ -102,6 +102,7 @@ from . import recipe_metadata_t as recipe_metadata_t
102
102
  from . import recipe_output_metadata_t as recipe_output_metadata_t
103
103
  from . import recipe_step_relationships_t as recipe_step_relationships_t
104
104
  from . import recipe_tags_t as recipe_tags_t
105
+ from . import recipe_workflow_step_types_t as recipe_workflow_step_types_t
105
106
  from . import recipe_workflow_steps_t as recipe_workflow_steps_t
106
107
  from . import recipes_t as recipes_t
107
108
  from .api.integrations import register_sockets_token as register_sockets_token_t
@@ -143,6 +144,7 @@ from .api.outputs import update_output_condition_parameter as update_output_cond
143
144
  from . import uploader_t as uploader_t
144
145
  from .api.condition_parameters import upsert_condition_match as upsert_condition_match_t
145
146
  from .api.field_options import upsert_field_options as upsert_field_options_t
147
+ from .api.recipes import upsert_recipe_workflow_step as upsert_recipe_workflow_step_t
146
148
  from .api.recipes import upsert_step_relationships as upsert_step_relationships_t
147
149
  from . import users_t as users_t
148
150
  from . import webhook_job_t as webhook_job_t
@@ -150,6 +152,7 @@ from . import workflows_t as workflows_t
150
152
 
151
153
 
152
154
  __all__: list[str] = [
155
+ "add_file_to_folder_t",
153
156
  "add_notebook_content_t",
154
157
  "add_recipe_to_project_t",
155
158
  "add_time_series_data_t",
@@ -170,7 +173,6 @@ __all__: list[str] = [
170
173
  "convert_chemical_formats_t",
171
174
  "create_entities_t",
172
175
  "create_entity_t",
173
- "create_file_record_t",
174
176
  "create_inputs_t",
175
177
  "create_mix_order_t",
176
178
  "create_or_update_entity_t",
@@ -250,6 +252,7 @@ __all__: list[str] = [
250
252
  "recipe_output_metadata_t",
251
253
  "recipe_step_relationships_t",
252
254
  "recipe_tags_t",
255
+ "recipe_workflow_step_types_t",
253
256
  "recipe_workflow_steps_t",
254
257
  "recipes_t",
255
258
  "register_sockets_token_t",
@@ -291,6 +294,7 @@ __all__: list[str] = [
291
294
  "uploader_t",
292
295
  "upsert_condition_match_t",
293
296
  "upsert_field_options_t",
297
+ "upsert_recipe_workflow_step_t",
294
298
  "upsert_step_relationships_t",
295
299
  "users_t",
296
300
  "webhook_job_t",
@@ -8,8 +8,9 @@ import datetime # noqa: F401
8
8
  from decimal import Decimal # noqa: F401
9
9
  import dataclasses
10
10
  from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
11
12
  from ... import base_t
12
- from ... import response_t
13
+ from ... import identifier_t
13
14
 
14
15
  __all__: list[str] = [
15
16
  "Arguments",
@@ -19,23 +20,24 @@ __all__: list[str] = [
19
20
  ]
20
21
 
21
22
  ENDPOINT_METHOD = "POST"
22
- ENDPOINT_PATH = "api/external/file_upload/external_create_file_record"
23
+ ENDPOINT_PATH = "api/external/file_folders/add_file_to_folder"
23
24
 
24
25
 
25
26
  # DO NOT MODIFY -- This file is generated by type_spec
26
27
  @serial_class(
27
- named_type_path="sdk.api.files.create_file_record.Arguments",
28
+ named_type_path="sdk.api.file_folders.add_file_to_folder.Arguments",
28
29
  )
29
30
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
30
31
  class Arguments:
31
- pass
32
+ file_id: base_t.ObjectId
33
+ folder_key: identifier_t.IdentifierKey
32
34
 
33
35
 
34
36
  # DO NOT MODIFY -- This file is generated by type_spec
35
37
  @serial_class(
36
- named_type_path="sdk.api.files.create_file_record.Data",
38
+ named_type_path="sdk.api.file_folders.add_file_to_folder.Data",
37
39
  )
38
40
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
39
- class Data(response_t.Response):
40
- file_id: base_t.ObjectId
41
+ class Data(async_batch_t.AsyncBatchActionReturn):
42
+ pass
41
43
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -38,6 +38,7 @@ class Arguments:
38
38
  recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None
39
39
  identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None
40
40
  definition_key: identifier_t.IdentifierKey | None = None
41
+ recipe_key: identifier_t.IdentifierKey | None = None
41
42
 
42
43
 
43
44
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,46 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
12
+ from ... import base_t
13
+ from ... import identifier_t
14
+ from ... import recipe_workflow_step_types_t
15
+
16
+ __all__: list[str] = [
17
+ "Arguments",
18
+ "Data",
19
+ "ENDPOINT_METHOD",
20
+ "ENDPOINT_PATH",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "POST"
24
+ ENDPOINT_PATH = "api/external/recipes/upsert_recipe_workflow_step"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.upsert_recipe_workflow_step.Arguments",
30
+ )
31
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
+ class Arguments:
33
+ recipe_key: identifier_t.IdentifierKey
34
+ data_source: recipe_workflow_step_types_t.RecipeWorkflowStepDataSource
35
+ location: recipe_workflow_step_types_t.RecipeWorkflowStepLocation
36
+ recipe_workflow_step_key: identifier_t.IdentifierKey | None = None
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @serial_class(
41
+ named_type_path="sdk.api.recipes.upsert_recipe_workflow_step.Data",
42
+ )
43
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
+ class Data(async_batch_t.AsyncBatchActionReturn):
45
+ pass
46
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -34,6 +34,7 @@ from uncountable.types import notifications_t
34
34
  import uncountable.types.api.integrations.push_notification as push_notification_t
35
35
  from uncountable.types import recipe_identifiers_t
36
36
  from uncountable.types import recipe_metadata_t
37
+ from uncountable.types import recipe_workflow_step_types_t
37
38
  from uncountable.types import recipe_workflow_steps_t
38
39
  import uncountable.types.api.triggers.run_trigger as run_trigger_t
39
40
  import uncountable.types.api.entity.set_barcode as set_barcode_t
@@ -44,6 +45,7 @@ import uncountable.types.api.entity.unlock_entity as unlock_entity_t
44
45
  import uncountable.types.api.recipes.unlock_recipes as unlock_recipes_t
45
46
  from uncountable.types import uploader_t
46
47
  import uncountable.types.api.condition_parameters.upsert_condition_match as upsert_condition_match_t
48
+ import uncountable.types.api.recipes.upsert_recipe_workflow_step as upsert_recipe_workflow_step_t
47
49
  import uncountable.types.api.recipes.upsert_step_relationships as upsert_step_relationships_t
48
50
  import uuid
49
51
  from abc import ABC, abstractmethod
@@ -363,6 +365,7 @@ class AsyncBatchProcessorBase(ABC):
363
365
  recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None,
364
366
  identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None,
365
367
  definition_key: identifier_t.IdentifierKey | None = None,
368
+ recipe_key: identifier_t.IdentifierKey | None = None,
366
369
  depends_on: list[str] | None = None,
367
370
  _request_options: client_config_t.RequestOptions | None = None,
368
371
  ) -> async_batch_t.QueuedAsyncBatchRequest:
@@ -374,8 +377,9 @@ class AsyncBatchProcessorBase(ABC):
374
377
  :param workflow_id: The identifier of the workflow to create the recipe with
375
378
  :param workflow_variant_id: The identifier of the workflow variant to create the recipe with
376
379
  :param recipe_metadata: Metadata values to populate the recipe with
377
- :param identifiers: A recipe won't be created if it matches the identifier. An identifier must be unique in the schema
380
+ :param identifiers: [DEPRECATED] - use `recipeKey`. A recipe won't be created if it matches the identifier. An identifier must be unique in the schema. An error will be raised if an argument is provided to both `recipeKey` and `identifiers` properties.
378
381
  :param definition_key: The entity definition identifier, default is used if not supplied
382
+ :param recipe_key: If this identifier matches an existing recipe, the id of the existing recipe will be returned and no update will occur. Use the `lookup_entity` endpoint to match an existing recipe based on a set of field values.
379
383
  :param depends_on: A list of batch reference keys to process before processing this request
380
384
  """
381
385
  args = create_recipe_t.Arguments(
@@ -387,6 +391,7 @@ class AsyncBatchProcessorBase(ABC):
387
391
  recipe_metadata=recipe_metadata,
388
392
  identifiers=identifiers,
389
393
  definition_key=definition_key,
394
+ recipe_key=recipe_key,
390
395
  )
391
396
  json_data = serialize_for_api(args)
392
397
 
@@ -983,6 +988,44 @@ class AsyncBatchProcessorBase(ABC):
983
988
  batch_reference=req.batch_reference,
984
989
  )
985
990
 
991
+ def upsert_recipe_workflow_step(
992
+ self,
993
+ *,
994
+ recipe_key: identifier_t.IdentifierKey,
995
+ data_source: recipe_workflow_step_types_t.RecipeWorkflowStepDataSource,
996
+ location: recipe_workflow_step_types_t.RecipeWorkflowStepLocation,
997
+ recipe_workflow_step_key: identifier_t.IdentifierKey | None = None,
998
+ depends_on: list[str] | None = None,
999
+ _request_options: client_config_t.RequestOptions | None = None,
1000
+ ) -> async_batch_t.QueuedAsyncBatchRequest:
1001
+ """Create or update a recipe workflow step on a recipe
1002
+
1003
+ :param depends_on: A list of batch reference keys to process before processing this request
1004
+ """
1005
+ args = upsert_recipe_workflow_step_t.Arguments(
1006
+ recipe_key=recipe_key,
1007
+ data_source=data_source,
1008
+ location=location,
1009
+ recipe_workflow_step_key=recipe_workflow_step_key,
1010
+ )
1011
+ json_data = serialize_for_api(args)
1012
+
1013
+ batch_reference = str(uuid.uuid4())
1014
+
1015
+ req = async_batch_t.AsyncBatchRequest(
1016
+ path=async_batch_t.AsyncBatchRequestPath.UPSERT_RECIPE_WORKFLOW_STEP,
1017
+ data=json_data,
1018
+ depends_on=depends_on,
1019
+ batch_reference=batch_reference,
1020
+ )
1021
+
1022
+ self._enqueue(req)
1023
+
1024
+ return async_batch_t.QueuedAsyncBatchRequest(
1025
+ path=req.path,
1026
+ batch_reference=req.batch_reference,
1027
+ )
1028
+
986
1029
  def upsert_step_relationships(
987
1030
  self,
988
1031
  *,
@@ -54,6 +54,7 @@ class AsyncBatchRequestPath(StrEnum):
54
54
  UNLOCK_ENTITY = "entity/unlock_entity"
55
55
  RUN_TRIGGER = "triggers/run_trigger"
56
56
  UPSERT_STEP_RELATIONSHIPS = "recipes/upsert_step_relationships"
57
+ UPSERT_RECIPE_WORKFLOW_STEP = "recipes/upsert_recipe_workflow_step"
57
58
 
58
59
 
59
60
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -8,6 +8,7 @@ import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
10
  from pkgs.serialization import OpaqueKey
11
+ import uncountable.types.api.file_folders.add_file_to_folder as add_file_to_folder_t
11
12
  import uncountable.types.api.notebooks.add_notebook_content as add_notebook_content_t
12
13
  import uncountable.types.api.recipes.add_recipe_to_project as add_recipe_to_project_t
13
14
  import uncountable.types.api.recipes.add_time_series_data as add_time_series_data_t
@@ -24,7 +25,6 @@ import uncountable.types.api.runsheet.complete_async_upload as complete_async_up
24
25
  import uncountable.types.api.chemical.convert_chemical_formats as convert_chemical_formats_t
25
26
  import uncountable.types.api.entity.create_entities as create_entities_t
26
27
  import uncountable.types.api.entity.create_entity as create_entity_t
27
- import uncountable.types.api.files.create_file_record as create_file_record_t
28
28
  import uncountable.types.api.inputs.create_inputs as create_inputs_t
29
29
  import uncountable.types.api.recipes.create_mix_order as create_mix_order_t
30
30
  import uncountable.types.api.entity.create_or_update_entity as create_or_update_entity_t
@@ -86,6 +86,7 @@ import uncountable.types.api.integrations.push_notification as push_notification
86
86
  from uncountable.types import recipe_identifiers_t
87
87
  from uncountable.types import recipe_links_t
88
88
  from uncountable.types import recipe_metadata_t
89
+ from uncountable.types import recipe_workflow_step_types_t
89
90
  from uncountable.types import recipe_workflow_steps_t
90
91
  import uncountable.types.api.integrations.register_sockets_token as register_sockets_token_t
91
92
  import uncountable.types.api.recipes.remove_recipe_from_project as remove_recipe_from_project_t
@@ -119,6 +120,7 @@ import uncountable.types.api.outputs.update_output_condition_parameter as update
119
120
  from uncountable.types import uploader_t
120
121
  import uncountable.types.api.condition_parameters.upsert_condition_match as upsert_condition_match_t
121
122
  import uncountable.types.api.field_options.upsert_field_options as upsert_field_options_t
123
+ import uncountable.types.api.recipes.upsert_recipe_workflow_step as upsert_recipe_workflow_step_t
122
124
  import uncountable.types.api.recipes.upsert_step_relationships as upsert_step_relationships_t
123
125
  from abc import ABC, abstractmethod
124
126
  import dataclasses
@@ -140,6 +142,30 @@ class ClientMethods(ABC):
140
142
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
141
143
  ...
142
144
 
145
+ def add_file_to_folder(
146
+ self,
147
+ *,
148
+ file_id: base_t.ObjectId,
149
+ folder_key: identifier_t.IdentifierKey,
150
+ _request_options: client_config_t.RequestOptions | None = None,
151
+ ) -> add_file_to_folder_t.Data:
152
+ """Add a previously uploaded file to a folder in the Files repository. This is the second step of a two-step upload workflow: first upload the file via file_upload/external_create_file_record to obtain a file_id, then call this endpoint to place it in a target folder. Returns the created document's ID in result_id.
153
+
154
+ :param file_id: ID of the file upload returned by file_upload/external_create_file_record
155
+ :param folder_key: Target folder to place the file in. Use type 'id' with a folder ID, or type 'ref_name' with 'root' for the top-level folder.
156
+ """
157
+ args = add_file_to_folder_t.Arguments(
158
+ file_id=file_id,
159
+ folder_key=folder_key,
160
+ )
161
+ api_request = APIRequest(
162
+ method=add_file_to_folder_t.ENDPOINT_METHOD,
163
+ endpoint=add_file_to_folder_t.ENDPOINT_PATH,
164
+ args=args,
165
+ request_options=_request_options,
166
+ )
167
+ return self.do_request(api_request=api_request, return_type=add_file_to_folder_t.Data)
168
+
143
169
  def add_notebook_content(
144
170
  self,
145
171
  *,
@@ -470,23 +496,6 @@ class ClientMethods(ABC):
470
496
  )
471
497
  return self.do_request(api_request=api_request, return_type=create_entity_t.Data)
472
498
 
473
- def create_file_record(
474
- self,
475
- *,
476
- _request_options: client_config_t.RequestOptions | None = None,
477
- ) -> create_file_record_t.Data:
478
- """Upload Files to Uncountable and retrieve the File Id. File bytes must be included in a multi-part form field that shares its name with the uploaded file.
479
-
480
- """
481
- args = create_file_record_t.Arguments()
482
- api_request = APIRequest(
483
- method=create_file_record_t.ENDPOINT_METHOD,
484
- endpoint=create_file_record_t.ENDPOINT_PATH,
485
- args=args,
486
- request_options=_request_options,
487
- )
488
- return self.do_request(api_request=api_request, return_type=create_file_record_t.Data)
489
-
490
499
  def external_create_inputs(
491
500
  self,
492
501
  *,
@@ -570,6 +579,7 @@ class ClientMethods(ABC):
570
579
  recipe_metadata: list[recipe_metadata_t.MetadataValue] | None = None,
571
580
  identifiers: recipe_identifiers_t.RecipeIdentifiers | None = None,
572
581
  definition_key: identifier_t.IdentifierKey | None = None,
582
+ recipe_key: identifier_t.IdentifierKey | None = None,
573
583
  _request_options: client_config_t.RequestOptions | None = None,
574
584
  ) -> create_recipe_t.Data:
575
585
  """Returns the id of the recipe being created.
@@ -580,8 +590,9 @@ class ClientMethods(ABC):
580
590
  :param workflow_id: The identifier of the workflow to create the recipe with
581
591
  :param workflow_variant_id: The identifier of the workflow variant to create the recipe with
582
592
  :param recipe_metadata: Metadata values to populate the recipe with
583
- :param identifiers: A recipe won't be created if it matches the identifier. An identifier must be unique in the schema
593
+ :param identifiers: [DEPRECATED] - use `recipeKey`. A recipe won't be created if it matches the identifier. An identifier must be unique in the schema. An error will be raised if an argument is provided to both `recipeKey` and `identifiers` properties.
584
594
  :param definition_key: The entity definition identifier, default is used if not supplied
595
+ :param recipe_key: If this identifier matches an existing recipe, the id of the existing recipe will be returned and no update will occur. Use the `lookup_entity` endpoint to match an existing recipe based on a set of field values.
585
596
  """
586
597
  args = create_recipe_t.Arguments(
587
598
  name=name,
@@ -592,6 +603,7 @@ class ClientMethods(ABC):
592
603
  recipe_metadata=recipe_metadata,
593
604
  identifiers=identifiers,
594
605
  definition_key=definition_key,
606
+ recipe_key=recipe_key,
595
607
  )
596
608
  api_request = APIRequest(
597
609
  method=create_recipe_t.ENDPOINT_METHOD,
@@ -2438,6 +2450,32 @@ class ClientMethods(ABC):
2438
2450
  )
2439
2451
  return self.do_request(api_request=api_request, return_type=upsert_field_options_t.Data)
2440
2452
 
2453
+ def upsert_recipe_workflow_step(
2454
+ self,
2455
+ *,
2456
+ recipe_key: identifier_t.IdentifierKey,
2457
+ data_source: recipe_workflow_step_types_t.RecipeWorkflowStepDataSource,
2458
+ location: recipe_workflow_step_types_t.RecipeWorkflowStepLocation,
2459
+ recipe_workflow_step_key: identifier_t.IdentifierKey | None = None,
2460
+ _request_options: client_config_t.RequestOptions | None = None,
2461
+ ) -> upsert_recipe_workflow_step_t.Data:
2462
+ """Create or update a recipe workflow step on a recipe
2463
+
2464
+ """
2465
+ args = upsert_recipe_workflow_step_t.Arguments(
2466
+ recipe_key=recipe_key,
2467
+ data_source=data_source,
2468
+ location=location,
2469
+ recipe_workflow_step_key=recipe_workflow_step_key,
2470
+ )
2471
+ api_request = APIRequest(
2472
+ method=upsert_recipe_workflow_step_t.ENDPOINT_METHOD,
2473
+ endpoint=upsert_recipe_workflow_step_t.ENDPOINT_PATH,
2474
+ args=args,
2475
+ request_options=_request_options,
2476
+ )
2477
+ return self.do_request(api_request=api_request, return_type=upsert_recipe_workflow_step_t.Data)
2478
+
2441
2479
  def upsert_step_relationships(
2442
2480
  self,
2443
2481
  *,
@@ -77,6 +77,7 @@ __all__: list[str] = [
77
77
  "equipment": "Equipment",
78
78
  "equipment_maintenance": "Equipment Maintenance",
79
79
  "equipment_type": "Equipment Type",
80
+ "external_ai_connector": "External AI Connector",
80
81
  "external_ai_model": "External AI Model",
81
82
  "external_ai_session": "External AI Session",
82
83
  "experiment_group": "Experiment Group",
@@ -120,6 +121,7 @@ __all__: list[str] = [
120
121
  "measurement_group_input": "Request Measurement Group Input",
121
122
  "measurement_group_recipe": "Request Measurement Group Experiment",
122
123
  "measurement_requested": "Measurement Requested",
124
+ "milestone": "Milestone",
123
125
  "ml_job": "Batch Processing Job",
124
126
  "naming_scheme": "Naming Scheme",
125
127
  "naming_counter": "Naming Counter",
@@ -305,6 +307,7 @@ class EntityType(StrEnum):
305
307
  EQUIPMENT = "equipment"
306
308
  EQUIPMENT_MAINTENANCE = "equipment_maintenance"
307
309
  EQUIPMENT_TYPE = "equipment_type"
310
+ EXTERNAL_AI_CONNECTOR = "external_ai_connector"
308
311
  EXTERNAL_AI_MODEL = "external_ai_model"
309
312
  EXTERNAL_AI_SESSION = "external_ai_session"
310
313
  EXPERIMENT_GROUP = "experiment_group"
@@ -348,6 +351,7 @@ class EntityType(StrEnum):
348
351
  MEASUREMENT_GROUP_INPUT = "measurement_group_input"
349
352
  MEASUREMENT_GROUP_RECIPE = "measurement_group_recipe"
350
353
  MEASUREMENT_REQUESTED = "measurement_requested"
354
+ MILESTONE = "milestone"
351
355
  ML_JOB = "ml_job"
352
356
  NAMING_SCHEME = "naming_scheme"
353
357
  NAMING_COUNTER = "naming_counter"
@@ -30,6 +30,7 @@ from .listing_t import FilterScalarType as FilterScalarType
30
30
  from .listing_t import FilterIdType as FilterIdType
31
31
  from .listing_t import StringFilterValue as StringFilterValue
32
32
  from .listing_t import FilterSpecEquals as FilterSpecEquals
33
+ from .listing_t import FilterSpecEqualsBoolean as FilterSpecEqualsBoolean
33
34
  from .listing_t import FilterSpecInclude as FilterSpecInclude
34
35
  from .listing_t import FilterSpecIStrContains as FilterSpecIStrContains
35
36
  from .listing_t import FilterSpecIStrStartsWith as FilterSpecIStrStartsWith
@@ -33,6 +33,7 @@ __all__: list[str] = [
33
33
  "FilterSpec",
34
34
  "FilterSpecBase",
35
35
  "FilterSpecEquals",
36
+ "FilterSpecEqualsBoolean",
36
37
  "FilterSpecExists",
37
38
  "FilterSpecGeq",
38
39
  "FilterSpecGreater",
@@ -324,6 +325,7 @@ ColumnIdentifier = typing.Annotated[
324
325
  # DO NOT MODIFY -- This file is generated by type_spec
325
326
  class FilterRelation(StrEnum):
326
327
  EQUALS = "equals"
328
+ EQUALS_BOOLEAN = "equals_boolean"
327
329
  GREATER = "greater"
328
330
  GEQ = "geq"
329
331
  LESS = "less"
@@ -382,6 +384,17 @@ class FilterSpecEquals(FilterSpecBase):
382
384
  value: FilterScalarType
383
385
 
384
386
 
387
+ # DO NOT MODIFY -- This file is generated by type_spec
388
+ @serial_class(
389
+ named_type_path="sdk.listing.FilterSpecEqualsBoolean",
390
+ parse_require={"relation"},
391
+ )
392
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
393
+ class FilterSpecEqualsBoolean(FilterSpecBase):
394
+ relation: typing.Literal[FilterRelation.EQUALS_BOOLEAN] = FilterRelation.EQUALS_BOOLEAN
395
+ value: bool
396
+
397
+
385
398
  # DO NOT MODIFY -- This file is generated by type_spec
386
399
  @serial_class(
387
400
  named_type_path="sdk.listing.FilterSpecInclude",
@@ -475,12 +488,13 @@ class FilterSpecLeq(FilterSpecBase):
475
488
 
476
489
  # DO NOT MODIFY -- This file is generated by type_spec
477
490
  FilterSpec = typing.Annotated[
478
- FilterSpecEquals | FilterSpecGreater | FilterSpecGeq | FilterSpecLeq | FilterSpecIStrContains | FilterSpecIStrStartsWith | FilterSpecInclude | FilterSpecExists | FilterSpecLess,
491
+ FilterSpecEquals | FilterSpecEqualsBoolean | FilterSpecGreater | FilterSpecGeq | FilterSpecLeq | FilterSpecIStrContains | FilterSpecIStrStartsWith | FilterSpecInclude | FilterSpecExists | FilterSpecLess,
479
492
  serial_union_annotation(
480
493
  named_type_path="sdk.listing.FilterSpec",
481
494
  discriminator="relation",
482
495
  discriminator_map={
483
496
  "equals": FilterSpecEquals,
497
+ "equals_boolean": FilterSpecEqualsBoolean,
484
498
  "greater": FilterSpecGreater,
485
499
  "geq": FilterSpecGeq,
486
500
  "leq": FilterSpecLeq,
@@ -0,0 +1,15 @@
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 .recipe_workflow_step_types_t import RecipeWorkflowStepDataSourceType as RecipeWorkflowStepDataSourceType
7
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSourceBase as RecipeWorkflowStepDataSourceBase
8
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSourceWorkflowStep as RecipeWorkflowStepDataSourceWorkflowStep
9
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep as RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep
10
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepDataSource as RecipeWorkflowStepDataSource
11
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepLocationType as RecipeWorkflowStepLocationType
12
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepLocationBase as RecipeWorkflowStepLocationBase
13
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepLocationAtEnd as RecipeWorkflowStepLocationAtEnd
14
+ from .recipe_workflow_step_types_t import RecipeWorkflowStepLocation as RecipeWorkflowStepLocation
15
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,118 @@
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 base_t
14
+ from . import identifier_t
15
+ from . import recipe_workflow_steps_t
16
+
17
+ __all__: list[str] = [
18
+ "RecipeWorkflowStepDataSource",
19
+ "RecipeWorkflowStepDataSourceBase",
20
+ "RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep",
21
+ "RecipeWorkflowStepDataSourceType",
22
+ "RecipeWorkflowStepDataSourceWorkflowStep",
23
+ "RecipeWorkflowStepLocation",
24
+ "RecipeWorkflowStepLocationAtEnd",
25
+ "RecipeWorkflowStepLocationBase",
26
+ "RecipeWorkflowStepLocationType",
27
+ ]
28
+
29
+
30
+ # DO NOT MODIFY -- This file is generated by type_spec
31
+ class RecipeWorkflowStepDataSourceType(StrEnum):
32
+ WORKFLOW_STEP = "workflow_step"
33
+ COPY_RECIPE_WORKFLOW_STEP = "copy_recipe_workflow_step"
34
+
35
+
36
+ # DO NOT MODIFY -- This file is generated by type_spec
37
+ @serial_class(
38
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepDataSourceBase",
39
+ )
40
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
+ class RecipeWorkflowStepDataSourceBase:
42
+ type: RecipeWorkflowStepDataSourceType
43
+
44
+
45
+ # DO NOT MODIFY -- This file is generated by type_spec
46
+ @serial_class(
47
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepDataSourceWorkflowStep",
48
+ parse_require={"type"},
49
+ )
50
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
51
+ class RecipeWorkflowStepDataSourceWorkflowStep(RecipeWorkflowStepDataSourceBase):
52
+ type: typing.Literal[RecipeWorkflowStepDataSourceType.WORKFLOW_STEP] = RecipeWorkflowStepDataSourceType.WORKFLOW_STEP
53
+ workflow_step_key: identifier_t.IdentifierKey
54
+ name: str | None = None
55
+
56
+
57
+ # DO NOT MODIFY -- This file is generated by type_spec
58
+ @serial_class(
59
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep",
60
+ parse_require={"type"},
61
+ )
62
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
63
+ class RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep(RecipeWorkflowStepDataSourceBase):
64
+ type: typing.Literal[RecipeWorkflowStepDataSourceType.COPY_RECIPE_WORKFLOW_STEP] = RecipeWorkflowStepDataSourceType.COPY_RECIPE_WORKFLOW_STEP
65
+ source_recipe_workflow_step_identifier: recipe_workflow_steps_t.RecipeWorkflowStepIdentifierKey
66
+ name: str | None = None
67
+
68
+
69
+ # DO NOT MODIFY -- This file is generated by type_spec
70
+ RecipeWorkflowStepDataSource = typing.Annotated[
71
+ RecipeWorkflowStepDataSourceWorkflowStep | RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep,
72
+ serial_union_annotation(
73
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepDataSource",
74
+ discriminator="type",
75
+ discriminator_map={
76
+ "workflow_step": RecipeWorkflowStepDataSourceWorkflowStep,
77
+ "copy_recipe_workflow_step": RecipeWorkflowStepDataSourceCopyRecipeWorkflowStep,
78
+ },
79
+ ),
80
+ ]
81
+
82
+
83
+ # DO NOT MODIFY -- This file is generated by type_spec
84
+ class RecipeWorkflowStepLocationType(StrEnum):
85
+ AT_END = "at_end"
86
+
87
+
88
+ # DO NOT MODIFY -- This file is generated by type_spec
89
+ @serial_class(
90
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepLocationBase",
91
+ )
92
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
93
+ class RecipeWorkflowStepLocationBase:
94
+ type: RecipeWorkflowStepLocationType
95
+
96
+
97
+ # DO NOT MODIFY -- This file is generated by type_spec
98
+ @serial_class(
99
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepLocationAtEnd",
100
+ parse_require={"type"},
101
+ )
102
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
103
+ class RecipeWorkflowStepLocationAtEnd(RecipeWorkflowStepLocationBase):
104
+ type: typing.Literal[RecipeWorkflowStepLocationType.AT_END] = RecipeWorkflowStepLocationType.AT_END
105
+
106
+
107
+ # DO NOT MODIFY -- This file is generated by type_spec
108
+ RecipeWorkflowStepLocation = typing.Annotated[
109
+ typing.Union[RecipeWorkflowStepLocationAtEnd],
110
+ serial_union_annotation(
111
+ named_type_path="sdk.recipe_workflow_step_types.RecipeWorkflowStepLocation",
112
+ discriminator="type",
113
+ discriminator_map={
114
+ "at_end": RecipeWorkflowStepLocationAtEnd,
115
+ },
116
+ ),
117
+ ]
118
+ # 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.161
3
+ Version: 0.0.162
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,6 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.78.0
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
+ Requires-Dist: azure-storage-file-share==12.*
41
42
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
43
  Requires-Dist: msgspec<0.21,>=0.19
43
44
  Requires-Dist: tabulate==0.9.0
@@ -159,10 +159,10 @@ uncountable/integration/queue_runner/datastore/model.py,sha256=YPqlULU7FxuwjmhXG
159
159
  uncountable/integration/secret_retrieval/__init__.py,sha256=3QXVj35w8rRMxVvmmsViFYDi3lcb3g70incfalOEm6o,87
160
160
  uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=LBEf18KHtXZxg-ZZ80stJ1vW39AWf0CQllP6pNu3Eq8,2994
161
161
  uncountable/integration/webhook_server/entrypoint.py,sha256=RQndrVCKdaVBk-xJ592eGqeN-O0IOM7flXDGoJ2HXsc,3505
162
- uncountable/types/__init__.py,sha256=esThP6uP-M8uL3LFOdlKQomnWMWpyOTQFu4ZhrKZbe0,12749
162
+ uncountable/types/__init__.py,sha256=FTfD4Xlv77YSf3SrclyexVxEzJcIme-0MOq3oZBCi3o,12990
163
163
  uncountable/types/async_batch.py,sha256=yCCWrrLQfxXVqZp-KskxLBNkNmuELdz4PJjx8ULppgs,662
164
- uncountable/types/async_batch_processor.py,sha256=U7Sm3BltMhBeVOxrsQUP4Ai7v9sWDm5kNch6qlv6KZo,38217
165
- uncountable/types/async_batch_t.py,sha256=oXS59vYjuPhfbP0_zC0WyJNHABHMW_6Y9BVPjOYJ52o,4238
164
+ uncountable/types/async_batch_processor.py,sha256=GMEoEqh0BClpYv9ZGJZLT9CUrsw-XtD1XA-rmSnE61s,40266
165
+ uncountable/types/async_batch_t.py,sha256=AA2Jdf1z67qMocK81XlhVmVWp5j_ZCqQwks7GbR5r04,4310
166
166
  uncountable/types/async_jobs.py,sha256=JI0ScfawaqMRbJ2jbgW3YQLhijPnBeYdMnZJjygSxHg,322
167
167
  uncountable/types/async_jobs_t.py,sha256=u4xd3i512PZ-9592Q2ZgWh_faMiI4UMm0F_gOmZnerI,1389
168
168
  uncountable/types/auth_retrieval.py,sha256=770zjN1K9EF5zs1Xml7x6ke6Hkze7rcMT5FdDVCIl9M,549
@@ -173,7 +173,7 @@ uncountable/types/calculations.py,sha256=fApOFpgBemt_t7IVneVR0VdI3X5EOxiG6Xhzr6R
173
173
  uncountable/types/calculations_t.py,sha256=pl-lhjyDQuj11Sf9g1-0BsSkN7Ez8UxDp8-KMQ_3enM,709
174
174
  uncountable/types/chemical_structure.py,sha256=ujyragaD26-QG5jgKnWhO7TN3N1V9b_04T2WhqNYxxo,281
175
175
  uncountable/types/chemical_structure_t.py,sha256=VFFyits_vx4t5L2euu_qFiSpsGJjURkDPr3ISnr3nPc,855
176
- uncountable/types/client_base.py,sha256=losD-zdHnbm8mHvW0ptWHPxU62X3Zk-8y2yHhr3f8W8,109477
176
+ uncountable/types/client_base.py,sha256=piLkQpFo83kpPTIgFqLNb6mtEGcOC_h_IElsmcK5kBg,111793
177
177
  uncountable/types/client_config.py,sha256=M7FZ0m_lGmBsIYcMn8pm92DdoVzrLpzd8sH6DqTQLKo,456
178
178
  uncountable/types/client_config_t.py,sha256=m1sVg0zaVf8DvQKaDJH_fG1abU2-VZZH0wOIMDjlECU,1944
179
179
  uncountable/types/curves.py,sha256=QyEyC20jsG-LGKVx6miiF-w70vKMwNkILFBDIJ5Ok9g,345
@@ -181,7 +181,7 @@ uncountable/types/curves_t.py,sha256=DxYepdC3QKKR7mepOOBoyarNcFZQdUa5ZYH-hwCY3BI
181
181
  uncountable/types/data.py,sha256=u2isf4XEug3Eu-xSIoqGaCQmW2dFaKBHCkP_WKYwwBc,500
182
182
  uncountable/types/data_t.py,sha256=vFoypK_WMGfN28r1sSlDYHZNUdBQC0XCN7-_Mlo4FJk,2832
183
183
  uncountable/types/entity.py,sha256=Zclk1LYcRaYrMDhqyCjMSLEg0fE6_q8LHvV22Qvscgs,566
184
- uncountable/types/entity_t.py,sha256=8a3EWGsGWxsHaby0Ji95nd6uwA9txiR_UQWmpfl0Ic4,25606
184
+ uncountable/types/entity_t.py,sha256=Y6IE-ylyikpwH55hV40mhjr1VMoQEj3isdDUyxx8KOs,25778
185
185
  uncountable/types/experiment_groups.py,sha256=qUpFOx1AKgzaT_4khCOv5Xs6jwiQGbvHH-GUh3v1nv4,288
186
186
  uncountable/types/experiment_groups_t.py,sha256=29Ct-WPejpYMuGfnFfOoosU9iSfjzxpabpBX6oTPFUA,761
187
187
  uncountable/types/exports.py,sha256=VMmxUO2PpV1Y63hZ2AnVor4H-B6aswJ7YpSru_u89lU,334
@@ -208,8 +208,8 @@ uncountable/types/integrations.py,sha256=0fOhtbLIOl9w1GP9J3PTagRU8mjOKV48JNLLH3S
208
208
  uncountable/types/integrations_t.py,sha256=ihyhuMDKtJarQ19OppS0fYpJUYd8o5-w6YCDE440O-w,1871
209
209
  uncountable/types/job_definition.py,sha256=hYp5jPYLLYm3NKEqzQrQfXL0Ms5KgEQGTON13YWSPYk,1804
210
210
  uncountable/types/job_definition_t.py,sha256=3rdN-wNtswOEoWssbv2kVGw_J8fiUZRhCjCSr1h1c3U,9662
211
- uncountable/types/listing.py,sha256=TwF1WjFZK-MxeI90xVcPPC_IJrobyEg5y5DYoLlu8T4,2764
212
- uncountable/types/listing_t.py,sha256=Gmoq43ncFm5QmMehDphTxEeptKRDl8Y0Un-QNk1vL-4,18352
211
+ uncountable/types/listing.py,sha256=U-0-opI0Wgxzmwp4y0qhyT26aK_BjaqdlFVpjud-ryk,2838
212
+ uncountable/types/listing_t.py,sha256=pMvBcIZJY_94-fS2paRl0DxbWJPNYVeF6OYYyX-ppgM,18942
213
213
  uncountable/types/notices.py,sha256=j3BWaogmbLsVSqxdk6GZEnzIj30f0KVdNTP660kMeMk,346
214
214
  uncountable/types/notices_t.py,sha256=GibfAH5Ed68PqoNFyjXR9vPgQLVwH1zjaFC8EL_Ysf8,1021
215
215
  uncountable/types/notifications.py,sha256=ZGr1ULMG3cPMED83NbMjrjmgVzCeOTS1Tc-pFTNuY4Y,600
@@ -240,6 +240,8 @@ uncountable/types/recipe_step_relationships.py,sha256=qx2-_YA0Q4PuiwcM0BDixgnaxV
240
240
  uncountable/types/recipe_step_relationships_t.py,sha256=wwaAGq8NYkg9430BDdxFd89c4ubsJRft94FmrI3HPwM,520
241
241
  uncountable/types/recipe_tags.py,sha256=tKIwHY677lZCxrmOk1bbuZQgDuf1n1cNyp6c5r1uRbo,270
242
242
  uncountable/types/recipe_tags_t.py,sha256=zsA9NuIKsJg9kkN32gMxU32OjkJr2v2thgPgu7DXkCw,731
243
+ uncountable/types/recipe_workflow_step_types.py,sha256=ibdK4aKoy2iRD7wC85BR34Qq8geTnpKIBTLR5NjmVMQ,1229
244
+ uncountable/types/recipe_workflow_step_types_t.py,sha256=Z5Kd4zGldAuJhPv63GpJwjKIPjNQqYLfY-JRJGDhLbI,4597
243
245
  uncountable/types/recipe_workflow_steps.py,sha256=fb55_sREdeZrtguIZOuy4ZcTLbRBNAxQ3A0oGbH8muA,950
244
246
  uncountable/types/recipe_workflow_steps_t.py,sha256=sOpRcH2wGbqQ7UY9DhkaPaZcdVjMDx4ZrycEH3WLB7g,3671
245
247
  uncountable/types/recipes.py,sha256=6Z7bagYXX15kGlhYt_OFiYSD3lqFp4H0EquI1fUfYyk,286
@@ -298,9 +300,9 @@ uncountable/types/api/equipment/associate_equipment_input.py,sha256=K3LBXzmtOLgC
298
300
  uncountable/types/api/field_options/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
299
301
  uncountable/types/api/field_options/upsert_field_options.py,sha256=yhgbPXd75fTDzXJhZg2fiv3Nq_Ks6dhwDv6Q-6EjmZo,1631
300
302
  uncountable/types/api/file_folders/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
303
+ uncountable/types/api/file_folders/add_file_to_folder.py,sha256=h8mGJss2F-pWM2OaJFUlqTRyWbXx8Gz1GXGk1s5yDVo,1265
301
304
  uncountable/types/api/file_folders/modify_file_system.py,sha256=oklJa6g_KC18mQA-kkFmICO9pyGKLQNNG_QSYegkdkE,2815
302
305
  uncountable/types/api/files/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
303
- uncountable/types/api/files/create_file_record.py,sha256=joaPDTxCD518RjB0-dWVWoBYGpPqHWYYsqFzsVIt5MI,1167
304
306
  uncountable/types/api/files/download_file.py,sha256=pxFEha3PglQ767sSh3RjrT1a2Wu1P9uetNuEoBwAO24,3372
305
307
  uncountable/types/api/id_source/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
306
308
  uncountable/types/api/id_source/list_id_source.py,sha256=td3pA624Sv7tSpg5zifhx42AM203-m875i9JXo3P7kk,1542
@@ -353,7 +355,7 @@ uncountable/types/api/recipes/associate_recipe_as_input.py,sha256=vXtdffaWJGvK1r
353
355
  uncountable/types/api/recipes/associate_recipe_as_lot.py,sha256=SBfeNGn6TF2Fawemc1hkJkElWrxD89jvZiQvCnTawBs,1283
354
356
  uncountable/types/api/recipes/clear_recipe_outputs.py,sha256=IOHeOl7eO5Arzpfgjhk3y5eWY1lWb6xSzOrIC4uH78w,1227
355
357
  uncountable/types/api/recipes/create_mix_order.py,sha256=LMLTw5malVnHsegFsKW04SBHJFDIJheh_qQClRFRsPM,1345
356
- uncountable/types/api/recipes/create_recipe.py,sha256=ESgjPKKQLPLZUOqn20LpYupxYyKl8g52RE25TC-Gjx4,1594
358
+ uncountable/types/api/recipes/create_recipe.py,sha256=xN8tmQ5rXQDyCVUqIOOlRKZf6KbH1HtzxdUhK5X7sVM,1651
357
359
  uncountable/types/api/recipes/create_recipes.py,sha256=vSBCmHWdXDGacNXiRgK22G_nei8SHK1kwSJRRBQnaPU,2106
358
360
  uncountable/types/api/recipes/disassociate_recipe_as_input.py,sha256=Lka3041BI6nXYIzKFjvKs_E9XO67ioHuFg8bEB85GCM,1251
359
361
  uncountable/types/api/recipes/edit_recipe_inputs.py,sha256=TnkdLxbiU_27IJBPUrcAxjPZ3RlUV43Qf2-PXDtDlMs,14755
@@ -375,6 +377,7 @@ uncountable/types/api/recipes/set_recipe_tags.py,sha256=C4GzlHVfTDUA2CrgDqfYrDpS
375
377
  uncountable/types/api/recipes/set_recipe_total.py,sha256=K1eHfz95txl6EUoDNap3QEsRX-if2Ns5UihzMBawwMM,1859
376
378
  uncountable/types/api/recipes/unarchive_recipes.py,sha256=ke3JPaj6hRdTjP-Qot8Gc-_ptTYqC_1ZF3kKbPJ0H88,1145
377
379
  uncountable/types/api/recipes/unlock_recipes.py,sha256=Qa_qLyp0McWpaIAXIOJxe6L9p5dfdEId_TtgUk8Lnzo,1471
380
+ uncountable/types/api/recipes/upsert_recipe_workflow_step.py,sha256=S0IagClvKmTIX98GnMkREBri2qdgvOjao-p6afCwpEc,1509
378
381
  uncountable/types/api/recipes/upsert_step_relationships.py,sha256=FzIwxBRZYtsYwELGWZpPTFhqAEZVB0egX3XDvmZfYnQ,3097
379
382
  uncountable/types/api/runsheet/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
380
383
  uncountable/types/api/runsheet/complete_async_upload.py,sha256=r3zsmD8tcalMfa67MNdF7LE_YJjBsSXK07zZ9fMap0Y,1156
@@ -386,7 +389,7 @@ uncountable/types/api/uploader/complete_async_parse.py,sha256=ffS3ApqCNkZb6QPuYE
386
389
  uncountable/types/api/uploader/invoke_uploader.py,sha256=Bj7Dq4A90k00suacwk3bLA_dCb2aovS1kAbVam2AQnM,1395
387
390
  uncountable/types/api/user/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
388
391
  uncountable/types/api/user/get_current_user_info.py,sha256=Avqi_RXtRgbefrT_dwJ9MrO6eDNSSa_Nu650FSuESlg,1109
389
- uncountablepythonsdk-0.0.161.dist-info/METADATA,sha256=jkgvfUPUcb98RuEWZdbZ_wZtSl3F3M4gRrw-82CqiiU,2243
390
- uncountablepythonsdk-0.0.161.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
391
- uncountablepythonsdk-0.0.161.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
392
- uncountablepythonsdk-0.0.161.dist-info/RECORD,,
392
+ uncountablepythonsdk-0.0.162.dist-info/METADATA,sha256=rms0l-jk3HaKExTdt3MknfZGNeZimXkm6TJLKAIeNic,2289
393
+ uncountablepythonsdk-0.0.162.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
394
+ uncountablepythonsdk-0.0.162.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
395
+ uncountablepythonsdk-0.0.162.dist-info/RECORD,,