UncountablePythonSDK 0.0.183__py3-none-any.whl → 0.0.185__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.
docs/requirements.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  furo==2025.12.19
2
2
  myst-parser==5.1.0
3
- sphinx-autoapi==3.8.0
3
+ sphinx-autoapi==3.8.1
4
4
  sphinx-copybutton==0.5.2
5
5
  Sphinx==9.1.0
6
6
  sphinx_design==0.7.0
@@ -0,0 +1,44 @@
1
+ import json
2
+
3
+ from uncountable.integration.http_server import (
4
+ GenericHttpRequest,
5
+ GenericHttpResponse,
6
+ HttpException,
7
+ )
8
+ from uncountable.integration.job import CustomHttpJob, register_job
9
+ from uncountable.types import job_definition_t
10
+
11
+ _EXPECTED_USER_ID = 1
12
+
13
+
14
+ @register_job
15
+ class HttpGetExample(CustomHttpJob):
16
+ @staticmethod
17
+ def validate_request(
18
+ *,
19
+ request: GenericHttpRequest,
20
+ job_definition: job_definition_t.HttpJobDefinitionBase, # ruff:ignore[unused-static-method-argument]
21
+ profile_meta: job_definition_t.ProfileMetadata,
22
+ ) -> None:
23
+ if (
24
+ CustomHttpJob.get_validated_oauth_request_user_id(
25
+ request=request, profile_metadata=profile_meta
26
+ )
27
+ != _EXPECTED_USER_ID
28
+ ):
29
+ raise HttpException(
30
+ message="unauthorized; invalid oauth token", error_code=401
31
+ )
32
+
33
+ @staticmethod
34
+ def handle_request(
35
+ *,
36
+ request: GenericHttpRequest,
37
+ job_definition: job_definition_t.HttpJobDefinitionBase, # ruff:ignore[unused-static-method-argument]
38
+ profile_meta: job_definition_t.ProfileMetadata, # ruff:ignore[unused-static-method-argument]
39
+ ) -> GenericHttpResponse:
40
+ return GenericHttpResponse(
41
+ response=json.dumps(request.query_params),
42
+ status_code=200,
43
+ headers={"Content-Type": "application/json"},
44
+ )
@@ -74,6 +74,13 @@ jobs:
74
74
  executor:
75
75
  type: script
76
76
  import_path: example_http
77
+ - id: example_http_get
78
+ type: custom_http
79
+ name: Custom HTTP GET
80
+ http_method: get
81
+ executor:
82
+ type: script
83
+ import_path: example_http_get
77
84
  - id: example_runsheet_wh
78
85
  type: webhook
79
86
  name: Runsheet Webhook
@@ -13,7 +13,7 @@ dependencies = [
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pytz ==2026.*",
15
15
  "types-requests == 2.*",
16
- "types-simplejson == 3.*",
16
+ "types-simplejson ==4.*",
17
17
  "pandas-stubs",
18
18
  "xlrd == 2.*",
19
19
  "msgspec ==0.21.*",
@@ -210,8 +210,7 @@ def serialize_for_api(obj: Any) -> JsonValue:
210
210
  serialization_type == SerializationType.UNKNOWN
211
211
  ): # performance optimization to not do function lookup
212
212
  return obj # type: ignore
213
- r = _CONVERSION_SERIALIZATION_FUNCS[serialization_type](obj)
214
- return r
213
+ return _CONVERSION_SERIALIZATION_FUNCS[serialization_type](obj)
215
214
 
216
215
 
217
216
  _SERIALIZATION_FUNCS_DICT: dict[
@@ -82,6 +82,7 @@ def main() -> None:
82
82
  short_description=definition.short_description,
83
83
  description=definition.description,
84
84
  icon=definition.icon,
85
+ action=definition.action,
85
86
  ref_name=ref_name,
86
87
  module=actions_registry_t.ActionsRegistryModule(
87
88
  ts_name(module_str, name_case=builder.NameCase.convert)
@@ -51,6 +51,8 @@ def _emit_action_definition(
51
51
  out.write(f"{sub_indent}description={_py_str(action.description)},\n")
52
52
  if action.icon is not None:
53
53
  out.write(f"{sub_indent}icon={_py_str(action.icon)},\n")
54
+ if action.action is not None:
55
+ out.write(f"{sub_indent}action={_py_str(action.action)},\n")
54
56
  out.write(f"{sub_indent}ref_name={_py_str(action.ref_name)},\n")
55
57
  out.write(
56
58
  f"{sub_indent}module=actions_registry_t.ActionsRegistryModule.{action.module.name},\n"
@@ -130,6 +130,10 @@ def _emit_action_definition(
130
130
  out.write(
131
131
  f"{sub_indent}icon: {encode_common_string(action_definition.icon)},\n"
132
132
  )
133
+ if action_definition.action is not None:
134
+ out.write(
135
+ f"{sub_indent}action: {encode_common_string(action_definition.action)},\n"
136
+ )
133
137
  out.write(
134
138
  f"{sub_indent}shortDescription: {encode_common_string(action_definition.short_description)},\n"
135
139
  )
pkgs/type_spec/builder.py CHANGED
@@ -1106,6 +1106,7 @@ class SpecEndpoint:
1106
1106
  desc: str | None = None
1107
1107
  account_type: str | None
1108
1108
  route_group: str | None
1109
+ allow_non_materials_path: bool = False
1109
1110
 
1110
1111
  # function, path details per api endpoint
1111
1112
  path_per_api_endpoint: dict[str, EndpointSpecificPath]
@@ -1135,6 +1136,7 @@ class SpecEndpoint:
1135
1136
  "has_attachment",
1136
1137
  "account_type",
1137
1138
  "route_group",
1139
+ "allow_non_materials_path",
1138
1140
  ]
1139
1141
  + list(builder.api_endpoints.keys()),
1140
1142
  )
@@ -1188,6 +1190,10 @@ class SpecEndpoint:
1188
1190
  assert isinstance(suppress_ts, bool)
1189
1191
  self.suppress_ts = suppress_ts
1190
1192
 
1193
+ allow_non_materials_path = data.get("allow_non_materials_path", False)
1194
+ assert isinstance(allow_non_materials_path, bool)
1195
+ self.allow_non_materials_path = allow_non_materials_path
1196
+
1191
1197
  self.result_type = ResultType(data.get("result_type", ResultType.json.value))
1192
1198
  self.has_attachment = data.get("has_attachment", False)
1193
1199
  self.desc = data.get("desc")
@@ -1166,13 +1166,25 @@ def _emit_routes(*, builder: builder.SpecBuilder, config: PythonConfig) -> None:
1166
1166
  continue
1167
1167
 
1168
1168
  endpoints.append(endpoint)
1169
+
1170
+ has_route_opts = any(
1171
+ endpoint.allow_non_materials_path for endpoint in endpoints
1172
+ )
1173
+ route_opts_import = ["RouteOpts"] if has_route_opts else []
1174
+ static_route_imports = ", ".join(
1175
+ sorted(["StaticRouteType", *route_opts_import])
1176
+ )
1177
+ dynamic_route_imports = ", ".join(
1178
+ sorted(["DynamicRouteType", *route_opts_import])
1179
+ )
1180
+
1169
1181
  static_out = io.StringIO()
1170
1182
  static_out.write(
1171
1183
  f"""{MODIFY_NOTICE}{LINT_HEADER}{ROUTE_NOTICE}
1172
1184
 
1173
1185
  # Static routes for use locally and to ensure linting/mypy finds all modules
1174
1186
 
1175
- from main.site.framework.types import StaticRouteType
1187
+ from main.site.framework.types import {static_route_imports}
1176
1188
  """
1177
1189
  )
1178
1190
 
@@ -1218,7 +1230,7 @@ ROUTES: list[StaticRouteType] = [
1218
1230
 
1219
1231
  # Dynamic loaded routes to provide faster startup times
1220
1232
 
1221
- from main.site.framework.types import DynamicRouteType
1233
+ from main.site.framework.types import {dynamic_route_imports}
1222
1234
 
1223
1235
  ROUTE_PREFIX = "/{last_endpoint.path_per_api_endpoint[endpoint_root].path_root}"
1224
1236
 
@@ -1226,19 +1238,35 @@ ROUTES: list[DynamicRouteType] = [
1226
1238
  """
1227
1239
  )
1228
1240
 
1241
+ route_opts_out = io.StringIO()
1229
1242
  for endpoint in sorted_endpoints:
1230
1243
  endpoint_function_path = endpoint.path_per_api_endpoint[endpoint_root]
1244
+ route = f"{endpoint_function_path.path_dirname}/{endpoint_function_path.path_basename}"
1231
1245
  dynamic_out.write(
1232
- f'{INDENT}("{endpoint_function_path.path_dirname}/{endpoint_function_path.path_basename}", "{endpoint_function_path.function}", ["{endpoint.method.upper()}"]),\n'
1246
+ f'{INDENT}("{route}", "{endpoint_function_path.function}", ["{endpoint.method.upper()}"]),\n'
1233
1247
  )
1234
1248
 
1235
1249
  assert endpoint_function_path.function
1236
1250
  static_out.write(
1237
- f'{INDENT}("{endpoint_function_path.path_dirname}/{endpoint_function_path.path_basename}", {endpoint_function_path.function}, ["{endpoint.method.upper()}"]),\n'
1251
+ f'{INDENT}("{route}", {endpoint_function_path.function}, ["{endpoint.method.upper()}"]),\n'
1238
1252
  )
1239
1253
 
1240
- dynamic_out.write(f"{MODIFY_NOTICE}]\n")
1241
- static_out.write(f"{MODIFY_NOTICE}]\n")
1254
+ if endpoint.allow_non_materials_path:
1255
+ route_opts_out.write(
1256
+ f'{INDENT}"{route}": RouteOpts(allow_non_materials_path=True),\n'
1257
+ )
1258
+
1259
+ routes_close = f"{MODIFY_NOTICE}]\n"
1260
+ dynamic_out.write(routes_close)
1261
+ static_out.write(routes_close)
1262
+
1263
+ if has_route_opts:
1264
+ route_opts_emit = f"""
1265
+ ROUTE_OPTS: dict[str, RouteOpts] = {{
1266
+ {route_opts_out.getvalue()}{MODIFY_NOTICE}}}
1267
+ """
1268
+ dynamic_out.write(route_opts_emit)
1269
+ static_out.write(route_opts_emit)
1242
1270
 
1243
1271
  util.rewrite_file(f"{output}/routes_static.py", static_out.getvalue())
1244
1272
  util.rewrite_file(f"{output}/routes_dynamic.py", dynamic_out.getvalue())
@@ -68,6 +68,7 @@ class HttpException(Exception):
68
68
  class GenericHttpRequest:
69
69
  body_base64: str
70
70
  headers: dict[str, str]
71
+ query_params: dict[str, list[str]]
71
72
 
72
73
  @functools.cached_property
73
74
  def body_bytes(self) -> bytes:
@@ -1,4 +1,5 @@
1
1
  import base64
2
+ from typing import assert_never
2
3
 
3
4
  import flask
4
5
  from flask.typing import ResponseReturnValue
@@ -16,12 +17,31 @@ from uncountable.types import job_definition_t
16
17
 
17
18
  app = flask.Flask(__name__)
18
19
 
20
+ HttpJobDefinition = (
21
+ job_definition_t.CustomHttpJobDefinition
22
+ | job_definition_t.WebhookJobDefinition
23
+ | job_definition_t.UncountableWebhookJobDefinition
24
+ )
25
+
26
+
27
+ def _resolve_route_http_method(job: HttpJobDefinition) -> job_definition_t.HttpMethod:
28
+ match job:
29
+ case job_definition_t.CustomHttpJobDefinition():
30
+ return job.http_method
31
+ case (
32
+ job_definition_t.WebhookJobDefinition()
33
+ | job_definition_t.UncountableWebhookJobDefinition()
34
+ ):
35
+ return job_definition_t.HttpMethod.POST
36
+ case _:
37
+ assert_never(job)
38
+
19
39
 
20
40
  def register_route(
21
41
  *,
22
42
  server_logger: Logger,
23
43
  profile_meta: job_definition_t.ProfileMetadata,
24
- job: job_definition_t.HttpJobDefinitionBase,
44
+ job: HttpJobDefinition,
25
45
  ) -> None:
26
46
  route = f"/{profile_meta.name}/{job.id}"
27
47
  log_attributes = {
@@ -56,6 +76,7 @@ def register_route(
56
76
  http_request = GenericHttpRequest(
57
77
  body_base64=base64.b64encode(flask.request.get_data()).decode(),
58
78
  headers=dict(flask.request.headers),
79
+ query_params=flask.request.args.to_dict(flat=False),
59
80
  )
60
81
  job_instance.validate_request(
61
82
  request=http_request, job_definition=job, profile_meta=profile_meta
@@ -88,7 +109,7 @@ def register_route(
88
109
  route,
89
110
  endpoint=f"handle_request_{job.id}",
90
111
  view_func=handle_request,
91
- methods=["POST"],
112
+ methods=[_resolve_route_http_method(job).value.upper()],
92
113
  )
93
114
 
94
115
  server_logger.log_debug(
@@ -103,10 +124,21 @@ def main() -> None:
103
124
  for profile_metadata in profiles:
104
125
  server_logger = Logger(get_current_span())
105
126
  for job in profile_metadata.jobs:
106
- if isinstance(job, job_definition_t.HttpJobDefinitionBase):
107
- register_route(
108
- server_logger=server_logger, profile_meta=profile_metadata, job=job
109
- )
127
+ match job:
128
+ case job_definition_t.CronJobDefinition():
129
+ continue
130
+ case (
131
+ job_definition_t.CustomHttpJobDefinition()
132
+ | job_definition_t.WebhookJobDefinition()
133
+ | job_definition_t.UncountableWebhookJobDefinition()
134
+ ):
135
+ register_route(
136
+ server_logger=server_logger,
137
+ profile_meta=profile_metadata,
138
+ job=job,
139
+ )
140
+ case _:
141
+ assert_never(job)
110
142
 
111
143
 
112
144
  main()
@@ -30,7 +30,7 @@ __all__: list[str] = [
30
30
 
31
31
  ENDPOINT_METHOD = "GET"
32
32
  ENDPOINT_PATH = "api/external/files/download_file"
33
- ENDPOINT_DESCRIPTION = "Download an attachment field value from an entity (e.g. a file attached to a form field) by entity + field reference, or download a text document by its ID. When querying by entity field, if the field contains a single file it is returned directly (X-File-Download-Type: raw); if multiple files are attached, they are bundled into a ZIP archive (X-File-Download-Type: archive). For downloading the binary file stored on a recipe output of type image or file, use recipes/external_download_recipe_output_file instead."
33
+ ENDPOINT_DESCRIPTION = "Download an attachment field value from an entity (e.g. a file attached to a form field) by entity + field reference, or download a text document by its ID. When querying by entity field, if the field contains a single file it is returned directly (X-File-Download-Type: raw); if multiple files are attached, they are bundled into a ZIP archive (X-File-Download-Type: archive). For downloading the binary file stored on a recipe output of type image or file, use recipes/external_download_recipe_output_file instead. A file that has not cleared virus scanning is not returned: a file still being scanned responds with HTTP 422 indicating the scan is in progress, and a file that failed the scan responds with HTTP 422 indicating a security-scan failure."
34
34
 
35
35
 
36
36
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -27,6 +27,7 @@ __all__: list[str] = [
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
28
  @serial_string_enum(
29
29
  labels={
30
+ "agent_memory": "Agent Memory",
30
31
  "aggregated_data_view": "Aggregated Data View",
31
32
  "analytical_method": "Analytical Method",
32
33
  "analytical_method_category": "Analytical Method Category",
@@ -35,6 +36,8 @@ __all__: list[str] = [
35
36
  "approval": "Approval",
36
37
  "async_job": "Async Job",
37
38
  "barcode": "Barcode",
39
+ "cad_document": "CAD Document",
40
+ "cad_relationship": "CAD Relationship",
38
41
  "calculation": "Calculation",
39
42
  "calendar": "Calendar",
40
43
  "calendar_event": "Calendar Event",
@@ -57,6 +60,7 @@ __all__: list[str] = [
57
60
  "credit_balance": "Credit Balance",
58
61
  "curve_settings": "Curve Settings",
59
62
  "custom_entity": "Custom Entity",
63
+ "data_pipeline": "Data Pipeline",
60
64
  "dataset_binding": "Dataset Binding",
61
65
  "default_permissions_new_project": "Default Permissions New Project",
62
66
  "document": "Document",
@@ -90,6 +94,7 @@ __all__: list[str] = [
90
94
  "external_ai_model": "External AI Model",
91
95
  "external_ai_session": "External AI Session",
92
96
  "external_ai_usage": "External AI Usage",
97
+ "external_ai_plugin": "External AI Plugin",
93
98
  "external_oauth_provider": "External OAuth Provider",
94
99
  "experiment_group": "Experiment Group",
95
100
  "experiment_group_member": "Experiment Group Member",
@@ -206,6 +211,7 @@ __all__: list[str] = [
206
211
  "regional_entity_group": "Regional Entity Group",
207
212
  "regulation": "Regulation",
208
213
  "regulation_cas": "Regulation CAS",
214
+ "regulation_product_category": "Regulation Product Category",
209
215
  "metadata_value": "Metadata Value",
210
216
  "report_definition": "Report Definition",
211
217
  "reusable_field_condition": "Reusable Field Condition",
@@ -297,6 +303,7 @@ __all__: list[str] = [
297
303
  },
298
304
  )
299
305
  class EntityType(StrEnum):
306
+ AGENT_MEMORY = "agent_memory"
300
307
  AGGREGATED_DATA_VIEW = "aggregated_data_view"
301
308
  ANALYTICAL_METHOD = "analytical_method"
302
309
  ANALYTICAL_METHOD_CATEGORY = "analytical_method_category"
@@ -305,6 +312,8 @@ class EntityType(StrEnum):
305
312
  APPROVAL = "approval"
306
313
  ASYNC_JOB = "async_job"
307
314
  BARCODE = "barcode"
315
+ CAD_DOCUMENT = "cad_document"
316
+ CAD_RELATIONSHIP = "cad_relationship"
308
317
  CALCULATION = "calculation"
309
318
  CALENDAR = "calendar"
310
319
  CALENDAR_EVENT = "calendar_event"
@@ -327,6 +336,7 @@ class EntityType(StrEnum):
327
336
  CREDIT_BALANCE = "credit_balance"
328
337
  CURVE_SETTINGS = "curve_settings"
329
338
  CUSTOM_ENTITY = "custom_entity"
339
+ DATA_PIPELINE = "data_pipeline"
330
340
  DATASET_BINDING = "dataset_binding"
331
341
  DEFAULT_PERMISSIONS_NEW_PROJECT = "default_permissions_new_project"
332
342
  DOCUMENT = "document"
@@ -360,6 +370,7 @@ class EntityType(StrEnum):
360
370
  EXTERNAL_AI_MODEL = "external_ai_model"
361
371
  EXTERNAL_AI_SESSION = "external_ai_session"
362
372
  EXTERNAL_AI_USAGE = "external_ai_usage"
373
+ EXTERNAL_AI_PLUGIN = "external_ai_plugin"
363
374
  EXTERNAL_OAUTH_PROVIDER = "external_oauth_provider"
364
375
  EXPERIMENT_GROUP = "experiment_group"
365
376
  EXPERIMENT_GROUP_MEMBER = "experiment_group_member"
@@ -476,6 +487,7 @@ class EntityType(StrEnum):
476
487
  REGIONAL_ENTITY_GROUP = "regional_entity_group"
477
488
  REGULATION = "regulation"
478
489
  REGULATION_CAS = "regulation_cas"
490
+ REGULATION_PRODUCT_CATEGORY = "regulation_product_category"
479
491
  METADATA_VALUE = "metadata_value"
480
492
  REPORT_DEFINITION = "report_definition"
481
493
  REUSABLE_FIELD_CONDITION = "reusable_field_condition"
@@ -568,7 +580,7 @@ class EntityType(StrEnum):
568
580
 
569
581
  # DO NOT MODIFY -- This file is generated by type_spec
570
582
  LimitedEntityType = typing.Annotated[
571
- 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.NOTEBOOK] | typing.Literal[EntityType.OUTPUT] | typing.Literal[EntityType.OUTPUT_CONDITION_PARAMETER] | typing.Literal[EntityType.ASYNC_JOB] | typing.Literal[EntityType.CONSTRAINT] | typing.Literal[EntityType.CONSTRAINT_SET] | typing.Literal[EntityType.INGREDIENT_CATEGORY_ALL] | typing.Literal[EntityType.TIME_SERIES_SEGMENT] | typing.Literal[EntityType.EQUIPMENT_MAINTENANCE] | typing.Literal[EntityType.MAINTENANCE_SCHEDULE] | typing.Literal[EntityType.CONDITION_PARAMETER_RULE] | typing.Literal[EntityType.INGREDIENT] | typing.Literal[EntityType.TIMESHEET_ENTRY] | typing.Literal[EntityType.SAVE] | typing.Literal[EntityType.RECIPE_CHECK] | typing.Literal[EntityType.EXPERIMENT_GROUP_MEMBER] | typing.Literal[EntityType.CALENDAR_EVENT],
583
+ 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.NOTEBOOK] | typing.Literal[EntityType.OUTPUT] | typing.Literal[EntityType.OUTPUT_CONDITION_PARAMETER] | typing.Literal[EntityType.ASYNC_JOB] | typing.Literal[EntityType.CONSTRAINT] | typing.Literal[EntityType.CONSTRAINT_SET] | typing.Literal[EntityType.INGREDIENT_CATEGORY_ALL] | typing.Literal[EntityType.TIME_SERIES_SEGMENT] | typing.Literal[EntityType.EQUIPMENT_MAINTENANCE] | typing.Literal[EntityType.MAINTENANCE_SCHEDULE] | typing.Literal[EntityType.CONDITION_PARAMETER_RULE] | typing.Literal[EntityType.INGREDIENT] | typing.Literal[EntityType.TIMESHEET_ENTRY] | typing.Literal[EntityType.SAVE] | typing.Literal[EntityType.RECIPE_CHECK] | typing.Literal[EntityType.EXPERIMENT_GROUP_MEMBER] | typing.Literal[EntityType.INPUT_GROUP] | typing.Literal[EntityType.INPUT_GROUP_MEMBER] | typing.Literal[EntityType.CALENDAR_EVENT],
572
584
  serial_alias_annotation(
573
585
  named_type_path="sdk.entity.LimitedEntityType",
574
586
  ),
@@ -4,6 +4,7 @@
4
4
  # DO NOT MODIFY -- This file is generated by type_spec
5
5
  # Kept only for SDK backwards compatibility
6
6
  from .job_definition_t import JobDefinitionType as JobDefinitionType
7
+ from .job_definition_t import HttpMethod as HttpMethod
7
8
  from .job_definition_t import JobExecutorType as JobExecutorType
8
9
  from .job_definition_t import GenericUploadDataSourceType as GenericUploadDataSourceType
9
10
  from .job_definition_t import JobExecutorBase as JobExecutorBase
@@ -27,6 +27,7 @@ __all__: list[str] = [
27
27
  "GenericUploadDataSourceSFTP",
28
28
  "GenericUploadDataSourceType",
29
29
  "HttpJobDefinitionBase",
30
+ "HttpMethod",
30
31
  "JobDefinition",
31
32
  "JobDefinitionBase",
32
33
  "JobDefinitionType",
@@ -53,6 +54,12 @@ class JobDefinitionType(StrEnum):
53
54
  CUSTOM_HTTP = "custom_http"
54
55
 
55
56
 
57
+ # DO NOT MODIFY -- This file is generated by type_spec
58
+ class HttpMethod(StrEnum):
59
+ GET = "get"
60
+ POST = "post"
61
+
62
+
56
63
  # DO NOT MODIFY -- This file is generated by type_spec
57
64
  class JobExecutorType(StrEnum):
58
65
  SCRIPT = "script"
@@ -224,6 +231,7 @@ class HttpJobDefinitionBase(JobDefinitionBase):
224
231
  @dataclasses.dataclass(slots=True, kw_only=True)
225
232
  class CustomHttpJobDefinition(HttpJobDefinitionBase):
226
233
  type: typing.Literal[JobDefinitionType.CUSTOM_HTTP] = JobDefinitionType.CUSTOM_HTTP
234
+ http_method: HttpMethod = HttpMethod.POST
227
235
 
228
236
 
229
237
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -8,8 +8,10 @@ from .uploader_t import ChannelType as ChannelType
8
8
  from .uploader_t import StructureElementType as StructureElementType
9
9
  from .uploader_t import StructureElementBase as StructureElementBase
10
10
  from .uploader_t import DecimalValue as DecimalValue
11
+ from .uploader_t import IdValue as IdValue
11
12
  from .uploader_t import StringValue as StringValue
12
13
  from .uploader_t import BaseData as BaseData
14
+ from .uploader_t import FileHeaderData as FileHeaderData
13
15
  from .uploader_t import NumericHeaderData as NumericHeaderData
14
16
  from .uploader_t import TextHeaderData as TextHeaderData
15
17
  from .uploader_t import HeaderValue as HeaderValue
@@ -10,6 +10,7 @@ from enum import StrEnum
10
10
  import dataclasses
11
11
  from pkgs.serialization import serial_class
12
12
  from pkgs.serialization import serial_union_annotation
13
+ from . import base_t
13
14
 
14
15
  __all__: list[str] = [
15
16
  "BaseData",
@@ -17,9 +18,11 @@ __all__: list[str] = [
17
18
  "ChannelType",
18
19
  "DataChannel",
19
20
  "DecimalValue",
21
+ "FileHeaderData",
20
22
  "HeaderEntry",
21
23
  "HeaderType",
22
24
  "HeaderValue",
25
+ "IdValue",
23
26
  "NumericChannelData",
24
27
  "NumericHeaderData",
25
28
  "ParsedFileData",
@@ -35,6 +38,7 @@ __all__: list[str] = [
35
38
 
36
39
  # DO NOT MODIFY -- This file is generated by type_spec
37
40
  class HeaderType(StrEnum):
41
+ FILE_HEADER = "file_header"
38
42
  NUMERIC_HEADER = "numeric_header"
39
43
  TEXT_HEADER = "text_header"
40
44
 
@@ -71,6 +75,15 @@ class DecimalValue:
71
75
  value: Decimal
72
76
 
73
77
 
78
+ # DO NOT MODIFY -- This file is generated by type_spec
79
+ @serial_class(
80
+ named_type_path="sdk.uploader.IdValue",
81
+ )
82
+ @dataclasses.dataclass(slots=True, kw_only=True)
83
+ class IdValue:
84
+ value: base_t.ObjectId
85
+
86
+
74
87
  # DO NOT MODIFY -- This file is generated by type_spec
75
88
  @serial_class(
76
89
  named_type_path="sdk.uploader.StringValue",
@@ -90,6 +103,17 @@ class BaseData:
90
103
  type: str
91
104
 
92
105
 
106
+ # DO NOT MODIFY -- This file is generated by type_spec
107
+ @serial_class(
108
+ named_type_path="sdk.uploader.FileHeaderData",
109
+ parse_require={"type"},
110
+ )
111
+ @dataclasses.dataclass(slots=True, kw_only=True)
112
+ class FileHeaderData(BaseData):
113
+ type: typing.Literal[HeaderType.FILE_HEADER] = HeaderType.FILE_HEADER
114
+ data: IdValue | None
115
+
116
+
93
117
  # DO NOT MODIFY -- This file is generated by type_spec
94
118
  @serial_class(
95
119
  named_type_path="sdk.uploader.NumericHeaderData",
@@ -114,11 +138,12 @@ class TextHeaderData(BaseData):
114
138
 
115
139
  # DO NOT MODIFY -- This file is generated by type_spec
116
140
  HeaderValue = typing.Annotated[
117
- NumericHeaderData | TextHeaderData,
141
+ FileHeaderData | NumericHeaderData | TextHeaderData,
118
142
  serial_union_annotation(
119
143
  named_type_path="sdk.uploader.HeaderValue",
120
144
  discriminator="type",
121
145
  discriminator_map={
146
+ "file_header": FileHeaderData,
122
147
  "numeric_header": NumericHeaderData,
123
148
  "text_header": TextHeaderData,
124
149
  },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.183
3
+ Version: 0.0.185
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/.gitignore,sha256=_ebkZUcwfvfnGEJ95rfj1lxoBNd6EE9ZvtOc7FsbfFE,7
3
3
  docs/conf.py,sha256=KivJNvQWboXqJ07NMgcYY5tsV6CoIfyTpZh8jdn_5Qk,4239
4
4
  docs/index.md,sha256=g4Yi5831fEkywYkkcFohYLkKzSI91SOZF7DxKsm9zgI,3193
5
5
  docs/justfile,sha256=WymCEQ6W2A8Ak79iUPmecmuaUNN2htb7STUrz5K7ELE,273
6
- docs/requirements.txt,sha256=8aqtVaNV4AlzUZ7nAM8kxOF1ccAcujhQ_ayU9Whksf8,172
6
+ docs/requirements.txt,sha256=_GyKrMFrmjp2hKhTLlhGdKqD7kXs_bomeY4yGt1oI7c,172
7
7
  docs/integration_examples/add_file_to_folder.md,sha256=ZCv8miP7ZlPjor-ZGDwy2oucyopqMPa3aXlmOEfbX10,1556
8
8
  docs/integration_examples/create_ingredient.md,sha256=ufzAzPyGaDr9rCBDMGQAE8xahsCMkVfG8VLs1pb3qr0,1549
9
9
  docs/integration_examples/create_output.md,sha256=aDn2TjzKgY-HnxnvgsZS578cvajmHpF1y2HKkHfdtd4,2104
@@ -33,16 +33,17 @@ examples/set_recipe_metadata_file.py,sha256=cRVXGz4UN4aqnNrNSzyBmikYHpe63lMIuzOp
33
33
  examples/set_recipe_output_file_sdk.py,sha256=Lz1amqppnWTX83z-C090wCJ4hcKmCD3kb-4v0uBRi0Y,782
34
34
  examples/stream_dataset_measurements.py,sha256=iLmDn7Yv-deeUsfDY9DhYckheoTfLhj5_ORjO0oLHng,5890
35
35
  examples/upload_files.py,sha256=qMaSvMSdTMPOOP55y1AwEurc0SOdZAMvEydlqJPsGpg,432
36
- examples/integration-server/pyproject.toml,sha256=ATAn8vGr9cRRKtceYjwQHParKwfzz_j46rIEEOq4SvE,11591
36
+ examples/integration-server/pyproject.toml,sha256=CxNt8vQ17Po7h4fOXT8jtbrFJosxBVTVY8kTuRyxtjY,11590
37
37
  examples/integration-server/jobs/materials_auto/concurrent_cron.py,sha256=xsK3H9ZEaniedC2nJUB0rqOcFI8y-ojfl_nLSJb9AMM,312
38
38
  examples/integration-server/jobs/materials_auto/example_cron.py,sha256=y1nAtGwbPJfIrfQsrHVmJLAHmQtCEHIy1g-0PjeXx04,735
39
39
  examples/integration-server/jobs/materials_auto/example_http.py,sha256=hA--iNztlTwLaEBzlmoRZ6-hRTUExUUqLV0-ipU7_mo,1560
40
+ examples/integration-server/jobs/materials_auto/example_http_get.py,sha256=_MyrwSBVCbDbb0VEmCpXpHIJzKC8NnEwjAXpQFiotyM,1438
40
41
  examples/integration-server/jobs/materials_auto/example_instrument.py,sha256=XWy1mCvDwL_Yfl3psFkD1ZX3K2vDQxPXgcMIABB5bLQ,3351
41
42
  examples/integration-server/jobs/materials_auto/example_parse.py,sha256=Z3iqAUdI5ya07VS3XayjK8brKuAyaqXlImJMJIUHz_4,8660
42
43
  examples/integration-server/jobs/materials_auto/example_predictions.py,sha256=5fO4rqRa80_968A1uVZn2TlMOUib54A8rumGW02sIMM,2112
43
44
  examples/integration-server/jobs/materials_auto/example_runsheet_wh.py,sha256=7FWDz3QpueVcf83fPrwGSqxs9pX06iKcQFte_vz3dC8,2944
44
45
  examples/integration-server/jobs/materials_auto/example_wh.py,sha256=PN-skP27yJwDZboWk5g5EZEc3AKfVayQLfnopjsDKJc,659
45
- examples/integration-server/jobs/materials_auto/profile.yaml,sha256=N9kX-xczfgBSqnfY5qsxmjxXkBXLhMnZU1TOMWI1hfg,2587
46
+ examples/integration-server/jobs/materials_auto/profile.yaml,sha256=qEgEunAcmuIIVsGCvNZ1sFJPfrefonN5r9BLTt5DIFg,2750
46
47
  pkgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
48
  pkgs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
49
  pkgs/argument_parser/__init__.py,sha256=cEEOAQS8UJ4Kbuo0oCVAHHhkbYCfrH6cUTTt2Mq3PmI,1445
@@ -81,19 +82,19 @@ pkgs/serialization_util/__init__.py,sha256=DEMIjEmOVZHuSwsxI9uUs3CNDSztNgcpOp35D
81
82
  pkgs/serialization_util/_get_type_for_serialization.py,sha256=dW5_W9MFd6wgWfW5qlWork-GBb-QFLtiOZkjk2Zqn2M,1177
82
83
  pkgs/serialization_util/convert_to_snakecase.py,sha256=VeI7d6JMexvfveZBZE4brMTyW4I9BEdl38bioQn8M6g,759
83
84
  pkgs/serialization_util/dataclasses.py,sha256=ErjxC60hnn_2XpQM-OyQBsVOaTz8JaHB--g4CjwoTK4,417
84
- pkgs/serialization_util/serialization_helpers.py,sha256=v8omOQ2BRZZCzMeUwu29fCEqx0UNDJ_iNbqpW4oHk84,7804
85
+ pkgs/serialization_util/serialization_helpers.py,sha256=UhekzGUcscopGTknPeb-_XM19u17jLBmbqhrpqNjkcg,7794
85
86
  pkgs/strenum_compat/__init__.py,sha256=Bq1kcPIQsXRiLUGWc63QGnVa5BlhvuFWpMMvdNcHy00,76
86
87
  pkgs/strenum_compat/strenum_compat.py,sha256=uOUAgpYTjHs1MX8dG81jRlyTkt3KNbkV_25zp7xTX2s,36
87
88
  pkgs/type_spec/__init__.py,sha256=h5DmJTca4QVV10sZR1x0-MlkZfuGYDfapR3zHvXfzto,19
88
89
  pkgs/type_spec/__main__.py,sha256=snBwPNvzU46Rqp4HlYb5Urv10Rs36gUbsPoFZfQcWRY,1162
89
- pkgs/type_spec/builder.py,sha256=yDtMWRd1EeHlcS9SqR1RKZ0ovuasmIgjpg0v4DvZ4mg,66086
90
+ pkgs/type_spec/builder.py,sha256=i8uMhsG7cJa5Dxn25RQyJk9pgwvOd1mc-bO0O49tYxA,66376
90
91
  pkgs/type_spec/builder_types.py,sha256=EFXvwd3DhuFcqMtG12U9RHNYXHxi_g6kY5AVPBo3fCg,253
91
92
  pkgs/type_spec/config.py,sha256=8SQkCRAKzrcycR-9Tjt6J4-kNalN8IvbE7zo1FMlrZc,7226
92
93
  pkgs/type_spec/cross_output_links.py,sha256=exmHrdr-Mrq6FyMXzWgmuKhE-uqo_rN5k_PcirQgrGU,3037
93
94
  pkgs/type_spec/emit_io_ts.py,sha256=sIdS5f_C79SiaSqVS4HtQ8SFxA87ehXkj9CrmrpjTzg,5862
94
95
  pkgs/type_spec/emit_open_api.py,sha256=C3PRRSQJpHUZkS4CeEMGywhbLYs_MD3t6u-DlVIe2WA,28638
95
96
  pkgs/type_spec/emit_open_api_util.py,sha256=bTmRvrGP82-eB75hwf9ySI7pDEC87FNQTF18VKEWSXY,2367
96
- pkgs/type_spec/emit_python.py,sha256=K9fH9wUw1h3y5Uxv4Xg2KFEMhDySuhDmV0v0xSPssHM,58681
97
+ pkgs/type_spec/emit_python.py,sha256=R66jEWVL0RcN15xDUvjNBe4YcT15hBfKyWU-k5ipbWo,59567
97
98
  pkgs/type_spec/emit_scss.py,sha256=6psmBAJyu7cvfQAIvIIMk2U6VFG_xeWy1Ea4afv0XyM,1497
98
99
  pkgs/type_spec/emit_typescript.py,sha256=Qu9f1Yv_wc449KHcBGO58hatbzvPvgMbZ11jferi3oY,11567
99
100
  pkgs/type_spec/emit_typescript_util.py,sha256=dRiOm38M4DR5NtvJyaEoGXE8Zzrfnae6yuDC76OzCeU,14915
@@ -103,9 +104,9 @@ pkgs/type_spec/open_api_util.py,sha256=LX6ny4xNOWXQO3qWVM8elrSDTqWsj_7jFplax2POS
103
104
  pkgs/type_spec/test.py,sha256=4ueujBq-pEgnX3Z69HyPmD-bullFXmpixcpVzfOkhP4,489
104
105
  pkgs/type_spec/util.py,sha256=Yc7QTZDjlu4ndOu3BwxLy5gRwG2mhnXN_s-iY9SYnIo,4834
105
106
  pkgs/type_spec/actions_registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
- pkgs/type_spec/actions_registry/__main__.py,sha256=tnVGrh8stDuhMGimx8dtjz8lPQ89sjHqezR6beTDlF8,4681
107
- pkgs/type_spec/actions_registry/emit_python.py,sha256=6vidMRCQk3qqo9Akz07fy_c2TUkkX_Pb8nXJhyBdDNE,3650
108
- pkgs/type_spec/actions_registry/emit_typescript.py,sha256=F0BRJpXVO8OJzqJgW_mv35D3scdhSpU0PN8HKO0cQIM,6626
107
+ pkgs/type_spec/actions_registry/__main__.py,sha256=hWUnmiG68xeW5GhnIolfHOvPY2GI_kxMgqwtOSgLlvo,4723
108
+ pkgs/type_spec/actions_registry/emit_python.py,sha256=atY1_Z9Ue6r1nBsMeoeX02vQCc_UpAnDLK7gdVNemZ4,3753
109
+ pkgs/type_spec/actions_registry/emit_typescript.py,sha256=XqmbX5OrgjdCGQf4-iNc_aZ7JiXgaVGt1wJcpAUh8SA,6787
109
110
  pkgs/type_spec/parts/base.py.prepart,sha256=1BCL7DCPoot5CYR3O-IpcOvMVthe1cbTQkTiUeZvuk8,2316
110
111
  pkgs/type_spec/parts/base.ts.prepart,sha256=m5aM7AU_42w3Lpbm_s3GYnuFxH3EcUlnFq7zOIE1fDo,1820
111
112
  pkgs/type_spec/type_info/__main__.py,sha256=TLNvCHGcmaj_8Sj5bAQNpuNaaw2dpDzoFDWZds0V4Qo,1002
@@ -151,7 +152,7 @@ uncountable/integration/executors/executors.py,sha256=E3a0_yrQesfigDzjhUAwD7-l-o
151
152
  uncountable/integration/executors/generic_upload_executor.py,sha256=MuNzrMnAaj6PBhrfTKX6e6vyQhwoDeBrYLz96ai653k,12149
152
153
  uncountable/integration/executors/script_executor.py,sha256=hKq09fOG89OAZ1Iq7wm2OgpUz1bh7DIYdZ2yn6ySr10,881
153
154
  uncountable/integration/http_server/__init__.py,sha256=ld7hD3wOGwAbnVRBrkTUCP5zNG-kptMd4wGJyQvUWVc,170
154
- uncountable/integration/http_server/types.py,sha256=9Hnt_rvrhGh0MCj1O2k2KHF81U85jURUnG6vt0boPDk,2425
155
+ uncountable/integration/http_server/types.py,sha256=yrpSEPz7mS8xfNHCsYtDD3OIgZpu1dsND4pRELxFI6A,2464
155
156
  uncountable/integration/queue_runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
157
  uncountable/integration/queue_runner/job_process.py,sha256=OONJ7aLsE80qIJ2ABLY3HYyKI7VdpBjI_pPQ3GCC13U,2586
157
158
  uncountable/integration/queue_runner/job_runner.py,sha256=Yh9hYfEYOya3BR6ypsal3LKPKrrEb4VQwfGuh4qyU2w,6115
@@ -180,7 +181,7 @@ uncountable/integration/queue_runner/datastore/model.py,sha256=06_fGS0QTALEA_381
180
181
  uncountable/integration/secret_retrieval/__init__.py,sha256=sisf8cxCYcJmCXCKjEPoT2xIxm1j-Ru9iTfMVxH6NM0,171
181
182
  uncountable/integration/secret_retrieval/basic_secret.py,sha256=PfpeaEDwdi8nFlHUJnzCob9GYgGG5O_3mmcaxPPY6zI,3272
182
183
  uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=c0VkCvppWKXwgxdblQuj2WhRaEGBPa7vLDoS6mlNOAQ,3919
183
- uncountable/integration/webhook_server/entrypoint.py,sha256=_1360zLIvEVQVf8ToyK-E2fnaszGKs2HcxcZjNraADc,4268
184
+ uncountable/integration/webhook_server/entrypoint.py,sha256=e7aYLsp5ht8Bzmj522_-5xSEm9zyHw-NGvggYCWClDE,5399
184
185
  uncountable/types/__init__.py,sha256=7fIYhDsz995jFGK7wBXIVMzIxUJbltUmdqm9U6HA_QQ,14367
185
186
  uncountable/types/async_batch.py,sha256=yCCWrrLQfxXVqZp-KskxLBNkNmuELdz4PJjx8ULppgs,662
186
187
  uncountable/types/async_batch_processor.py,sha256=6Z1qx_H9IqLqp0rzpCtrRvw0DqQ2O5ctkEnw0yNVaV8,48727
@@ -207,7 +208,7 @@ uncountable/types/data_t.py,sha256=U_dIh5GcyaJlkrHEI4Qf4TOo1uJX07PYO70sYzzKtTo,2
207
208
  uncountable/types/dataset_measurements.py,sha256=CVwWePUC02B_R_UB86yfNBwnclR-5xpZaiCs2jWtu2A,512
208
209
  uncountable/types/dataset_measurements_t.py,sha256=iVwh-3Z23aXmPJcUJ3s9axPeOs627DElE_dhfj_PRlQ,1711
209
210
  uncountable/types/entity.py,sha256=Zclk1LYcRaYrMDhqyCjMSLEg0fE6_q8LHvV22Qvscgs,566
210
- uncountable/types/entity_t.py,sha256=s8qf6fRnpjyWTveVc0fzs3zL4rUMXD7YrKfwyqgcD6I,29331
211
+ uncountable/types/entity_t.py,sha256=1ysk_fygPjWr3MQlWQYLCZkcpxHGEiwDGebqMTGfaDo,29968
211
212
  uncountable/types/experiment_groups.py,sha256=qUpFOx1AKgzaT_4khCOv5Xs6jwiQGbvHH-GUh3v1nv4,288
212
213
  uncountable/types/experiment_groups_t.py,sha256=QjZBdjnbsD1D-VpPSSV6hBg-Q7mujjKvYtdMewtXNVU,712
213
214
  uncountable/types/exports.py,sha256=VMmxUO2PpV1Y63hZ2AnVor4H-B6aswJ7YpSru_u89lU,334
@@ -232,8 +233,8 @@ uncountable/types/integration_session.py,sha256=MVTtZa04INF4L8PxPjqz3l1Lse6Hze3I
232
233
  uncountable/types/integration_session_t.py,sha256=Nnes-u2RzvZYsybQsNhtBfbA3d2W_nuDjAS_mU6L6yM,1801
233
234
  uncountable/types/integrations.py,sha256=0fOhtbLIOl9w1GP9J3PTagRU8mjOKV48JNLLH3SJQP0,472
234
235
  uncountable/types/integrations_t.py,sha256=ZWwEP13mIkSiljSHN2p05XCwRgT2bdADs-8hiVQTs3I,1752
235
- uncountable/types/job_definition.py,sha256=aiaoOPgQNK1sn6sNVXzGi5NLwHfz6aHZfDSrvC9M2LE,1901
236
- uncountable/types/job_definition_t.py,sha256=IRMG_xRRH9lsn_BgAZOj2elRMTZ1gzWYKUlTFXGydYE,9650
236
+ uncountable/types/job_definition.py,sha256=s6hjlxlJgAyD9aDjV0EdAMc0zW91XCD8h7VBX9I9bIE,1956
237
+ uncountable/types/job_definition_t.py,sha256=bGBvhDi0CIRmeKC5jGw5bb-LDBG53czZaZlYbgo5tuQ,9832
237
238
  uncountable/types/listing.py,sha256=U-0-opI0Wgxzmwp4y0qhyT26aK_BjaqdlFVpjud-ryk,2838
238
239
  uncountable/types/listing_t.py,sha256=z0hpUlburpIrVA5KcO1TRjkyAGGuAHvpHt5Fo6cAqIc,17521
239
240
  uncountable/types/ml_reports.py,sha256=qhZ36pbFLOcoET3D_K2DiNx59bjp8WyurbCrWPsZTrM,757
@@ -292,8 +293,8 @@ uncountable/types/step_relationships.py,sha256=I6t7tj-VmHAhH8YpJPIUFBxPaRiXU_Zg-
292
293
  uncountable/types/step_relationships_t.py,sha256=pS9NJxYUab0XsHnninHXR8V-4ohofSP67iIDIhPR_QI,5306
293
294
  uncountable/types/units.py,sha256=yxuddayiE8cnzrjQiIsURisWc-Vm1F37uyS3fjM--Ao,254
294
295
  uncountable/types/units_t.py,sha256=6u4JAQFzVtaLcKo15JHsDXZ09no5nlHRQKAhGfiySPE,655
295
- uncountable/types/uploader.py,sha256=odT7wkBfXUf1MoFy6W5JzZ-WY8JX0vO6odGOS_C2Voo,1222
296
- uncountable/types/uploader_t.py,sha256=6YAJ-SqBLuzlP3e9VHtS3B2taIoqZO4UEk92d-P2-Y0,6138
296
+ uncountable/types/uploader.py,sha256=k9OEe6jxjlBcc3iiMl5LoLFEIuI-Z0z6-ec3OYMa5nQ,1322
297
+ uncountable/types/uploader_t.py,sha256=YrC8XQpMy6avkOTeBv-ma9iHE3pClJx6ZxgOVykKP3Q,6830
297
298
  uncountable/types/users.py,sha256=R-bFIh07mMl6HyxP8hKmlT-QMbBXZPZ7mVuOIeOlCsg,254
298
299
  uncountable/types/users_t.py,sha256=n2Ldc78cMU8gKynf2u9GvcKdelcKDRkjaOpAUO6Q5m4,678
299
300
  uncountable/types/webhook.py,sha256=ZLXFWaup9ueboI8D4-V3sRGZyb0pFXjzOTywlk8ZfF0,264
@@ -338,7 +339,7 @@ uncountable/types/api/file_folders/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHk
338
339
  uncountable/types/api/file_folders/add_file_to_folder.py,sha256=0CnGFFSKyLsN6bOOYieh0Esiqq5XgQWA83bUn1jWXwY,1534
339
340
  uncountable/types/api/file_folders/modify_file_system.py,sha256=tXjHwtR7hUudCiwtcM2lHXVc4sgCI_R3-w6SWWwpCTU,2950
340
341
  uncountable/types/api/files/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
341
- uncountable/types/api/files/download_file.py,sha256=Ou2fcfuyuuJeXL-brOpzEJfWqAcEFuUPRSHvx_ZU4nM,3746
342
+ uncountable/types/api/files/download_file.py,sha256=w_GNviiXHqrnFU2pbriy6sl5i415JA0TFzXeJB_o00A,3983
342
343
  uncountable/types/api/id_source/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
343
344
  uncountable/types/api/id_source/list_id_source.py,sha256=tvrFKTynmfcLekUJnYSxSQi5V0N68ULjtn6xx0RmKec,1585
344
345
  uncountable/types/api/id_source/match_id_source.py,sha256=xnKnhHQBYipJmMxfH-7MHyNM6QOTrkSApuN9oAlk2PA,1560
@@ -433,7 +434,7 @@ uncountable/types/api/uploader/complete_async_parse.py,sha256=Os1HAubxTlbut6Gylj
433
434
  uncountable/types/api/uploader/invoke_uploader.py,sha256=QU1KmAFgGHSWskZEKfaAww8rCj-hVNP0i4kMQE3x3Fc,1822
434
435
  uncountable/types/api/user/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
435
436
  uncountable/types/api/user/get_current_user_info.py,sha256=BT7bGp5SOHz3XdKWhhdZ6acnInafT2PgdJ-H4YH3W7c,1181
436
- uncountablepythonsdk-0.0.183.dist-info/METADATA,sha256=eX9guGMbvzFEFaLPrwMk5yJxSz8FW0_LUJz9tJ01hto,2211
437
- uncountablepythonsdk-0.0.183.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
438
- uncountablepythonsdk-0.0.183.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
439
- uncountablepythonsdk-0.0.183.dist-info/RECORD,,
437
+ uncountablepythonsdk-0.0.185.dist-info/METADATA,sha256=E0K3f473FaOotwX30VtrvhiIc-YIbHCdyS2TyY2-pVY,2211
438
+ uncountablepythonsdk-0.0.185.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
439
+ uncountablepythonsdk-0.0.185.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
440
+ uncountablepythonsdk-0.0.185.dist-info/RECORD,,