UncountablePythonSDK 0.0.133__py3-none-any.whl → 0.0.135.dev2__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.
Files changed (31) hide show
  1. examples/integration-server/jobs/materials_auto/example_cron.py +1 -1
  2. examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +51 -14
  3. pkgs/type_spec/builder.py +15 -1
  4. uncountable/integration/cli.py +60 -1
  5. uncountable/integration/queue_runner/command_server/command_client.py +24 -0
  6. uncountable/integration/queue_runner/command_server/command_server.py +34 -0
  7. uncountable/integration/queue_runner/command_server/protocol/command_server.proto +15 -0
  8. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +9 -3
  9. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +25 -0
  10. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +45 -0
  11. uncountable/integration/queue_runner/command_server/types.py +21 -1
  12. uncountable/integration/queue_runner/datastore/datastore_sqlite.py +25 -0
  13. uncountable/integration/queue_runner/datastore/interface.py +3 -0
  14. uncountable/integration/queue_runner/job_scheduler.py +36 -1
  15. uncountable/integration/queue_runner/types.py +2 -0
  16. uncountable/integration/queue_runner/worker.py +28 -26
  17. uncountable/integration/scheduler.py +64 -13
  18. uncountable/integration/telemetry.py +79 -0
  19. uncountable/types/__init__.py +2 -2
  20. uncountable/types/api/files/download_file.py +15 -1
  21. uncountable/types/api/listing/fetch_listing.py +1 -2
  22. uncountable/types/api/runsheet/export_default_runsheet.py +44 -0
  23. uncountable/types/client_base.py +56 -0
  24. uncountable/types/listing.py +37 -0
  25. uncountable/types/listing_t.py +483 -1
  26. {uncountablepythonsdk-0.0.133.dist-info → uncountablepythonsdk-0.0.135.dev2.dist-info}/METADATA +2 -2
  27. {uncountablepythonsdk-0.0.133.dist-info → uncountablepythonsdk-0.0.135.dev2.dist-info}/RECORD +29 -30
  28. uncountable/types/structured_filters.py +0 -25
  29. uncountable/types/structured_filters_t.py +0 -248
  30. {uncountablepythonsdk-0.0.133.dist-info → uncountablepythonsdk-0.0.135.dev2.dist-info}/WHEEL +0 -0
  31. {uncountablepythonsdk-0.0.133.dist-info → uncountablepythonsdk-0.0.135.dev2.dist-info}/top_level.txt +0 -0
@@ -10,19 +10,60 @@ 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 pkgs.serialization import serial_alias_annotation
14
+ from pkgs.serialization import serial_string_enum
13
15
  from . import base_t
14
16
  from . import entity_t
15
17
 
16
18
  __all__: list[str] = [
19
+ "AggregateLoadTypes",
17
20
  "ColumnIdentifier",
18
21
  "ColumnIdentifierEntityRefName",
22
+ "ColumnIdentifierTransitive",
23
+ "ColumnIdentifierTransitiveAggregate",
19
24
  "ColumnType",
25
+ "DateGroupType",
26
+ "FilterIdType",
27
+ "FilterNode",
28
+ "FilterNodeBase",
29
+ "FilterNodeColumnAnd",
30
+ "FilterNodeType",
31
+ "FilterRelation",
32
+ "FilterScalarType",
33
+ "FilterSpec",
34
+ "FilterSpecBase",
35
+ "FilterSpecEquals",
36
+ "FilterSpecExists",
37
+ "FilterSpecGeq",
38
+ "FilterSpecGreater",
39
+ "FilterSpecIStrContains",
40
+ "FilterSpecIStrStartsWith",
41
+ "FilterSpecInclude",
42
+ "FilterSpecLeq",
43
+ "FilterSpecLess",
44
+ "LoadAggregateCollect",
45
+ "LoadAggregateCollectDistinct",
46
+ "LoadAggregateCount",
47
+ "LoadAggregateCountDistinct",
48
+ "LoadAggregateFirst",
49
+ "LoadAggregateGroupBy",
50
+ "LoadAggregateGroupByDate",
51
+ "LoadAggregateMax",
52
+ "LoadAggregateMean",
53
+ "LoadAggregateMin",
54
+ "LoadAggregateStddev",
55
+ "LoadAggregateSum",
56
+ "LoadAggregateType",
57
+ "LoadAggregateUniqueValue",
58
+ "StringFilterValue",
20
59
  ]
21
60
 
22
61
 
23
62
  # DO NOT MODIFY -- This file is generated by type_spec
24
63
  class ColumnType(StrEnum):
25
64
  REF_NAME = "ref_name"
65
+ TRANSITIVE = "transitive"
66
+ TRANSITIVE_AGGREGATE = "transitive_aggregate"
26
67
 
27
68
 
28
69
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -37,14 +78,455 @@ class ColumnIdentifierEntityRefName:
37
78
  entity_ref_name: str
38
79
 
39
80
 
81
+ # DO NOT MODIFY -- This file is generated by type_spec
82
+ @serial_class(
83
+ named_type_path="sdk.listing.ColumnIdentifierTransitive",
84
+ parse_require={"type"},
85
+ )
86
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
87
+ class ColumnIdentifierTransitive:
88
+ type: typing.Literal[ColumnType.TRANSITIVE] = ColumnType.TRANSITIVE
89
+ entity_type: entity_t.EntityType
90
+ via: ColumnIdentifier
91
+ target: ColumnIdentifier
92
+
93
+
94
+ # DO NOT MODIFY -- This file is generated by type_spec
95
+ @serial_string_enum(
96
+ labels={
97
+ "group_by": "Group By",
98
+ "group_by_date": "Group By Date",
99
+ "collect": "Collect",
100
+ "collect_distinct": "Distinct",
101
+ "count": "Count",
102
+ "count_distinct": "Count Distinct",
103
+ "first": "First",
104
+ "unique_value": "Unique Value",
105
+ "min": "Minimum",
106
+ "max": "Maximum",
107
+ "mean": "Mean",
108
+ "stddev": "Standard Deviation",
109
+ "sum": "Sum",
110
+ },
111
+ )
112
+ class LoadAggregateType(StrEnum):
113
+ GROUP_BY = "group_by"
114
+ GROUP_BY_DATE = "group_by_date"
115
+ COLLECT = "collect"
116
+ COLLECT_DISTINCT = "collect_distinct"
117
+ COUNT = "count"
118
+ COUNT_DISTINCT = "count_distinct"
119
+ FIRST = "first"
120
+ UNIQUE_VALUE = "unique_value"
121
+ MIN = "min"
122
+ MAX = "max"
123
+ MEAN = "mean"
124
+ STDDEV = "stddev"
125
+ SUM = "sum"
126
+
127
+
128
+ # DO NOT MODIFY -- This file is generated by type_spec
129
+ @serial_class(
130
+ named_type_path="sdk.listing.LoadAggregateGroupBy",
131
+ parse_require={"type"},
132
+ )
133
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
134
+ class LoadAggregateGroupBy:
135
+ type: typing.Literal[LoadAggregateType.GROUP_BY] = LoadAggregateType.GROUP_BY
136
+
137
+
138
+ # DO NOT MODIFY -- This file is generated by type_spec
139
+ @serial_class(
140
+ named_type_path="sdk.listing.LoadAggregateCollect",
141
+ parse_require={"type"},
142
+ )
143
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
144
+ class LoadAggregateCollect:
145
+ type: typing.Literal[LoadAggregateType.COLLECT] = LoadAggregateType.COLLECT
146
+
147
+
148
+ # DO NOT MODIFY -- This file is generated by type_spec
149
+ @serial_class(
150
+ named_type_path="sdk.listing.LoadAggregateCollectDistinct",
151
+ parse_require={"type"},
152
+ )
153
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
154
+ class LoadAggregateCollectDistinct:
155
+ type: typing.Literal[LoadAggregateType.COLLECT_DISTINCT] = LoadAggregateType.COLLECT_DISTINCT
156
+
157
+
158
+ # DO NOT MODIFY -- This file is generated by type_spec
159
+ @serial_class(
160
+ named_type_path="sdk.listing.LoadAggregateCount",
161
+ parse_require={"type"},
162
+ )
163
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
164
+ class LoadAggregateCount:
165
+ type: typing.Literal[LoadAggregateType.COUNT] = LoadAggregateType.COUNT
166
+
167
+
168
+ # DO NOT MODIFY -- This file is generated by type_spec
169
+ @serial_class(
170
+ named_type_path="sdk.listing.LoadAggregateCountDistinct",
171
+ parse_require={"type"},
172
+ )
173
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
174
+ class LoadAggregateCountDistinct:
175
+ type: typing.Literal[LoadAggregateType.COUNT_DISTINCT] = LoadAggregateType.COUNT_DISTINCT
176
+
177
+
178
+ # DO NOT MODIFY -- This file is generated by type_spec
179
+ @serial_class(
180
+ named_type_path="sdk.listing.LoadAggregateFirst",
181
+ parse_require={"type"},
182
+ )
183
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
184
+ class LoadAggregateFirst:
185
+ type: typing.Literal[LoadAggregateType.FIRST] = LoadAggregateType.FIRST
186
+
187
+
188
+ # DO NOT MODIFY -- This file is generated by type_spec
189
+ @serial_class(
190
+ named_type_path="sdk.listing.LoadAggregateUniqueValue",
191
+ parse_require={"type"},
192
+ )
193
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
194
+ class LoadAggregateUniqueValue:
195
+ type: typing.Literal[LoadAggregateType.UNIQUE_VALUE] = LoadAggregateType.UNIQUE_VALUE
196
+
197
+
198
+ # DO NOT MODIFY -- This file is generated by type_spec
199
+ @serial_class(
200
+ named_type_path="sdk.listing.LoadAggregateMin",
201
+ parse_require={"type"},
202
+ )
203
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
204
+ class LoadAggregateMin:
205
+ type: typing.Literal[LoadAggregateType.MIN] = LoadAggregateType.MIN
206
+
207
+
208
+ # DO NOT MODIFY -- This file is generated by type_spec
209
+ @serial_class(
210
+ named_type_path="sdk.listing.LoadAggregateMax",
211
+ parse_require={"type"},
212
+ )
213
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
214
+ class LoadAggregateMax:
215
+ type: typing.Literal[LoadAggregateType.MAX] = LoadAggregateType.MAX
216
+
217
+
218
+ # DO NOT MODIFY -- This file is generated by type_spec
219
+ @serial_class(
220
+ named_type_path="sdk.listing.LoadAggregateMean",
221
+ parse_require={"type"},
222
+ )
223
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
224
+ class LoadAggregateMean:
225
+ type: typing.Literal[LoadAggregateType.MEAN] = LoadAggregateType.MEAN
226
+
227
+
228
+ # DO NOT MODIFY -- This file is generated by type_spec
229
+ @serial_class(
230
+ named_type_path="sdk.listing.LoadAggregateStddev",
231
+ parse_require={"type"},
232
+ )
233
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
234
+ class LoadAggregateStddev:
235
+ type: typing.Literal[LoadAggregateType.STDDEV] = LoadAggregateType.STDDEV
236
+
237
+
238
+ # DO NOT MODIFY -- This file is generated by type_spec
239
+ @serial_class(
240
+ named_type_path="sdk.listing.LoadAggregateSum",
241
+ parse_require={"type"},
242
+ )
243
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
244
+ class LoadAggregateSum:
245
+ type: typing.Literal[LoadAggregateType.SUM] = LoadAggregateType.SUM
246
+
247
+
248
+ # DO NOT MODIFY -- This file is generated by type_spec
249
+ class DateGroupType(StrEnum):
250
+ DAY = "day"
251
+ WEEK = "week"
252
+ MONTH = "month"
253
+ QUARTER = "quarter"
254
+ YEAR = "year"
255
+
256
+
257
+ # DO NOT MODIFY -- This file is generated by type_spec
258
+ @serial_class(
259
+ named_type_path="sdk.listing.LoadAggregateGroupByDate",
260
+ parse_require={"type"},
261
+ )
262
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
263
+ class LoadAggregateGroupByDate:
264
+ type: typing.Literal[LoadAggregateType.GROUP_BY_DATE] = LoadAggregateType.GROUP_BY_DATE
265
+ date_group: DateGroupType
266
+ user_timezone: str | None = None
267
+
268
+
269
+ # DO NOT MODIFY -- This file is generated by type_spec
270
+ AggregateLoadTypes = typing.Annotated[
271
+ LoadAggregateGroupByDate | LoadAggregateGroupBy | LoadAggregateCollect | LoadAggregateCollectDistinct | LoadAggregateCount | LoadAggregateCountDistinct | LoadAggregateFirst | LoadAggregateUniqueValue | LoadAggregateMin | LoadAggregateMax | LoadAggregateMean | LoadAggregateStddev | LoadAggregateSum,
272
+ serial_union_annotation(
273
+ named_type_path="sdk.listing.AggregateLoadTypes",
274
+ discriminator="type",
275
+ discriminator_map={
276
+ "group_by_date": LoadAggregateGroupByDate,
277
+ "group_by": LoadAggregateGroupBy,
278
+ "collect": LoadAggregateCollect,
279
+ "collect_distinct": LoadAggregateCollectDistinct,
280
+ "count": LoadAggregateCount,
281
+ "count_distinct": LoadAggregateCountDistinct,
282
+ "first": LoadAggregateFirst,
283
+ "unique_value": LoadAggregateUniqueValue,
284
+ "min": LoadAggregateMin,
285
+ "max": LoadAggregateMax,
286
+ "mean": LoadAggregateMean,
287
+ "stddev": LoadAggregateStddev,
288
+ "sum": LoadAggregateSum,
289
+ },
290
+ ),
291
+ ]
292
+
293
+
294
+ # DO NOT MODIFY -- This file is generated by type_spec
295
+ @serial_class(
296
+ named_type_path="sdk.listing.ColumnIdentifierTransitiveAggregate",
297
+ parse_require={"type"},
298
+ )
299
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
300
+ class ColumnIdentifierTransitiveAggregate:
301
+ type: typing.Literal[ColumnType.TRANSITIVE_AGGREGATE] = ColumnType.TRANSITIVE_AGGREGATE
302
+ entity_type: entity_t.EntityType
303
+ via: ColumnIdentifier
304
+ target: ColumnIdentifier
305
+ aggregate: AggregateLoadTypes
306
+ filters: FilterNode | None = None
307
+
308
+
40
309
  # DO NOT MODIFY -- This file is generated by type_spec
41
310
  ColumnIdentifier = typing.Annotated[
42
- typing.Union[ColumnIdentifierEntityRefName],
311
+ ColumnIdentifierEntityRefName | ColumnIdentifierTransitive | ColumnIdentifierTransitiveAggregate,
43
312
  serial_union_annotation(
44
313
  named_type_path="sdk.listing.ColumnIdentifier",
45
314
  discriminator="type",
46
315
  discriminator_map={
47
316
  "ref_name": ColumnIdentifierEntityRefName,
317
+ "transitive": ColumnIdentifierTransitive,
318
+ "transitive_aggregate": ColumnIdentifierTransitiveAggregate,
319
+ },
320
+ ),
321
+ ]
322
+
323
+
324
+ # DO NOT MODIFY -- This file is generated by type_spec
325
+ class FilterRelation(StrEnum):
326
+ EQUALS = "equals"
327
+ GREATER = "greater"
328
+ GEQ = "geq"
329
+ LESS = "less"
330
+ LEQ = "leq"
331
+ ISTR_CONTAINS = "istr_contains"
332
+ ISTR_STARTS_WITH = "istr_starts_with"
333
+ INCLUDE = "include"
334
+ EXISTS = "exists"
335
+
336
+
337
+ # DO NOT MODIFY -- This file is generated by type_spec
338
+ @serial_class(
339
+ named_type_path="sdk.listing.FilterSpecBase",
340
+ )
341
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
342
+ class FilterSpecBase:
343
+ relation: FilterRelation
344
+ column: ColumnIdentifier
345
+
346
+
347
+ # DO NOT MODIFY -- This file is generated by type_spec
348
+ FilterScalarType = typing.Annotated[
349
+ str | int | Decimal,
350
+ serial_alias_annotation(
351
+ named_type_path="sdk.listing.FilterScalarType",
352
+ ),
353
+ ]
354
+
355
+
356
+ # DO NOT MODIFY -- This file is generated by type_spec
357
+ FilterIdType = typing.Annotated[
358
+ base_t.ObjectId | str,
359
+ serial_alias_annotation(
360
+ named_type_path="sdk.listing.FilterIdType",
361
+ ),
362
+ ]
363
+
364
+
365
+ # DO NOT MODIFY -- This file is generated by type_spec
366
+ StringFilterValue = typing.Annotated[
367
+ typing.Union[str],
368
+ serial_alias_annotation(
369
+ named_type_path="sdk.listing.StringFilterValue",
370
+ ),
371
+ ]
372
+
373
+
374
+ # DO NOT MODIFY -- This file is generated by type_spec
375
+ @serial_class(
376
+ named_type_path="sdk.listing.FilterSpecEquals",
377
+ parse_require={"relation"},
378
+ )
379
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
380
+ class FilterSpecEquals(FilterSpecBase):
381
+ relation: typing.Literal[FilterRelation.EQUALS] = FilterRelation.EQUALS
382
+ value: FilterScalarType
383
+
384
+
385
+ # DO NOT MODIFY -- This file is generated by type_spec
386
+ @serial_class(
387
+ named_type_path="sdk.listing.FilterSpecInclude",
388
+ parse_require={"relation"},
389
+ )
390
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
391
+ class FilterSpecInclude(FilterSpecBase):
392
+ relation: typing.Literal[FilterRelation.INCLUDE] = FilterRelation.INCLUDE
393
+ value: FilterIdType | tuple[FilterIdType, ...]
394
+
395
+
396
+ # DO NOT MODIFY -- This file is generated by type_spec
397
+ @serial_class(
398
+ named_type_path="sdk.listing.FilterSpecIStrContains",
399
+ parse_require={"relation"},
400
+ )
401
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
402
+ class FilterSpecIStrContains(FilterSpecBase):
403
+ relation: typing.Literal[FilterRelation.ISTR_CONTAINS] = FilterRelation.ISTR_CONTAINS
404
+ value: str
405
+
406
+
407
+ # DO NOT MODIFY -- This file is generated by type_spec
408
+ @serial_class(
409
+ named_type_path="sdk.listing.FilterSpecIStrStartsWith",
410
+ parse_require={"relation"},
411
+ )
412
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
413
+ class FilterSpecIStrStartsWith(FilterSpecBase):
414
+ relation: typing.Literal[FilterRelation.ISTR_STARTS_WITH] = FilterRelation.ISTR_STARTS_WITH
415
+ value: str
416
+
417
+
418
+ # DO NOT MODIFY -- This file is generated by type_spec
419
+ @serial_class(
420
+ named_type_path="sdk.listing.FilterSpecExists",
421
+ parse_require={"relation"},
422
+ )
423
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
424
+ class FilterSpecExists(FilterSpecBase):
425
+ relation: typing.Literal[FilterRelation.EXISTS] = FilterRelation.EXISTS
426
+
427
+
428
+ # DO NOT MODIFY -- This file is generated by type_spec
429
+ @serial_class(
430
+ named_type_path="sdk.listing.FilterSpecGreater",
431
+ to_string_values={"value"},
432
+ parse_require={"relation"},
433
+ )
434
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
435
+ class FilterSpecGreater(FilterSpecBase):
436
+ relation: typing.Literal[FilterRelation.GREATER] = FilterRelation.GREATER
437
+ value: Decimal
438
+
439
+
440
+ # DO NOT MODIFY -- This file is generated by type_spec
441
+ @serial_class(
442
+ named_type_path="sdk.listing.FilterSpecLess",
443
+ to_string_values={"value"},
444
+ parse_require={"relation"},
445
+ )
446
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
447
+ class FilterSpecLess(FilterSpecBase):
448
+ relation: typing.Literal[FilterRelation.LESS] = FilterRelation.LESS
449
+ value: Decimal
450
+
451
+
452
+ # DO NOT MODIFY -- This file is generated by type_spec
453
+ @serial_class(
454
+ named_type_path="sdk.listing.FilterSpecGeq",
455
+ to_string_values={"value"},
456
+ parse_require={"relation"},
457
+ )
458
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
459
+ class FilterSpecGeq(FilterSpecBase):
460
+ relation: typing.Literal[FilterRelation.GEQ] = FilterRelation.GEQ
461
+ value: Decimal
462
+
463
+
464
+ # DO NOT MODIFY -- This file is generated by type_spec
465
+ @serial_class(
466
+ named_type_path="sdk.listing.FilterSpecLeq",
467
+ to_string_values={"value"},
468
+ parse_require={"relation"},
469
+ )
470
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
471
+ class FilterSpecLeq(FilterSpecBase):
472
+ relation: typing.Literal[FilterRelation.LEQ] = FilterRelation.LEQ
473
+ value: Decimal
474
+
475
+
476
+ # DO NOT MODIFY -- This file is generated by type_spec
477
+ FilterSpec = typing.Annotated[
478
+ FilterSpecEquals | FilterSpecGreater | FilterSpecGeq | FilterSpecLeq | FilterSpecIStrContains | FilterSpecIStrStartsWith | FilterSpecInclude | FilterSpecExists | FilterSpecLess,
479
+ serial_union_annotation(
480
+ named_type_path="sdk.listing.FilterSpec",
481
+ discriminator="relation",
482
+ discriminator_map={
483
+ "equals": FilterSpecEquals,
484
+ "greater": FilterSpecGreater,
485
+ "geq": FilterSpecGeq,
486
+ "leq": FilterSpecLeq,
487
+ "istr_contains": FilterSpecIStrContains,
488
+ "istr_starts_with": FilterSpecIStrStartsWith,
489
+ "include": FilterSpecInclude,
490
+ "exists": FilterSpecExists,
491
+ "less": FilterSpecLess,
492
+ },
493
+ ),
494
+ ]
495
+
496
+
497
+ # DO NOT MODIFY -- This file is generated by type_spec
498
+ class FilterNodeType(StrEnum):
499
+ COLUMN_AND = "column_and"
500
+
501
+
502
+ # DO NOT MODIFY -- This file is generated by type_spec
503
+ @serial_class(
504
+ named_type_path="sdk.listing.FilterNodeBase",
505
+ )
506
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
507
+ class FilterNodeBase:
508
+ type: FilterNodeType
509
+
510
+
511
+ # DO NOT MODIFY -- This file is generated by type_spec
512
+ @serial_class(
513
+ named_type_path="sdk.listing.FilterNodeColumnAnd",
514
+ parse_require={"type"},
515
+ )
516
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True, frozen=True, eq=True) # type: ignore[literal-required]
517
+ class FilterNodeColumnAnd:
518
+ type: typing.Literal[FilterNodeType.COLUMN_AND] = FilterNodeType.COLUMN_AND
519
+ filters: tuple[FilterSpec, ...]
520
+
521
+
522
+ # DO NOT MODIFY -- This file is generated by type_spec
523
+ FilterNode = typing.Annotated[
524
+ typing.Union[FilterNodeColumnAnd],
525
+ serial_union_annotation(
526
+ named_type_path="sdk.listing.FilterNode",
527
+ discriminator="type",
528
+ discriminator_map={
529
+ "column_and": FilterNodeColumnAnd,
48
530
  },
49
531
  ),
50
532
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.133
3
+ Version: 0.0.135.dev2
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
@@ -48,7 +48,7 @@ Requires-Dist: mypy==1.*; extra == "test"
48
48
  Requires-Dist: ruff==0.*; extra == "test"
49
49
  Requires-Dist: pytest==8.*; extra == "test"
50
50
  Requires-Dist: coverage[toml]==7.*; extra == "test"
51
- Requires-Dist: pytest-cov==6.*; extra == "test"
51
+ Requires-Dist: pytest-cov==7.*; extra == "test"
52
52
  Requires-Dist: pytest-xdist==3.*; extra == "test"
53
53
 
54
54
  # Uncountable Python SDK