cocoindex 0.1.72__cp311-cp311-macosx_11_0_arm64.whl → 0.1.73__cp311-cp311-macosx_11_0_arm64.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.
- cocoindex/_engine.cpython-311-darwin.so +0 -0
- cocoindex/convert.py +138 -95
- cocoindex/tests/test_convert.py +23 -2
- cocoindex/tests/test_typing.py +97 -207
- cocoindex/typing.py +173 -130
- {cocoindex-0.1.72.dist-info → cocoindex-0.1.73.dist-info}/METADATA +1 -1
- {cocoindex-0.1.72.dist-info → cocoindex-0.1.73.dist-info}/RECORD +10 -10
- {cocoindex-0.1.72.dist-info → cocoindex-0.1.73.dist-info}/WHEEL +0 -0
- {cocoindex-0.1.72.dist-info → cocoindex-0.1.73.dist-info}/entry_points.txt +0 -0
- {cocoindex-0.1.72.dist-info → cocoindex-0.1.73.dist-info}/licenses/LICENSE +0 -0
cocoindex/typing.py
CHANGED
@@ -67,10 +67,7 @@ else:
|
|
67
67
|
if not isinstance(params, tuple):
|
68
68
|
# No dimension provided, e.g., Vector[np.float32]
|
69
69
|
dtype = params
|
70
|
-
|
71
|
-
if dtype in DtypeRegistry._DTYPE_TO_KIND:
|
72
|
-
return Annotated[NDArray[dtype], VectorInfo(dim=None)]
|
73
|
-
return Annotated[list[dtype], VectorInfo(dim=None)]
|
70
|
+
vector_info = VectorInfo(dim=None)
|
74
71
|
else:
|
75
72
|
# Element type and dimension provided, e.g., Vector[np.float32, Literal[3]]
|
76
73
|
dtype, dim_literal = params
|
@@ -80,18 +77,20 @@ else:
|
|
80
77
|
if typing.get_origin(dim_literal) is Literal
|
81
78
|
else None
|
82
79
|
)
|
83
|
-
|
84
|
-
|
85
|
-
|
80
|
+
vector_info = VectorInfo(dim=dim_val)
|
81
|
+
|
82
|
+
# Use NDArray for supported numeric dtypes, else list
|
83
|
+
base_type = analyze_type_info(dtype).base_type
|
84
|
+
if is_numpy_number_type(base_type) or base_type is np.ndarray:
|
85
|
+
return Annotated[NDArray[dtype], vector_info]
|
86
|
+
return Annotated[list[dtype], vector_info]
|
86
87
|
|
87
88
|
|
88
89
|
TABLE_TYPES: tuple[str, str] = ("KTable", "LTable")
|
89
90
|
KEY_FIELD_NAME: str = "_key"
|
90
91
|
|
91
|
-
ElementType = type | tuple[type, type] | Annotated[Any, TypeKind]
|
92
|
-
|
93
92
|
|
94
|
-
def
|
93
|
+
def extract_ndarray_elem_dtype(ndarray_type: Any) -> Any:
|
95
94
|
args = typing.get_args(ndarray_type)
|
96
95
|
_, dtype_spec = args
|
97
96
|
dtype_args = typing.get_args(dtype_spec)
|
@@ -101,14 +100,14 @@ def extract_ndarray_scalar_dtype(ndarray_type: Any) -> Any:
|
|
101
100
|
|
102
101
|
|
103
102
|
def is_numpy_number_type(t: type) -> bool:
|
104
|
-
return isinstance(t, type) and issubclass(t, np.
|
103
|
+
return isinstance(t, type) and issubclass(t, (np.integer, np.floating))
|
105
104
|
|
106
105
|
|
107
106
|
def is_namedtuple_type(t: type) -> bool:
|
108
107
|
return isinstance(t, type) and issubclass(t, tuple) and hasattr(t, "_fields")
|
109
108
|
|
110
109
|
|
111
|
-
def is_struct_type(t:
|
110
|
+
def is_struct_type(t: Any) -> bool:
|
112
111
|
return isinstance(t, type) and (
|
113
112
|
dataclasses.is_dataclass(t) or is_namedtuple_type(t)
|
114
113
|
)
|
@@ -120,14 +119,14 @@ class DtypeRegistry:
|
|
120
119
|
Maps NumPy dtypes to their CocoIndex type kind.
|
121
120
|
"""
|
122
121
|
|
123
|
-
_DTYPE_TO_KIND: dict[
|
122
|
+
_DTYPE_TO_KIND: dict[Any, str] = {
|
124
123
|
np.float32: "Float32",
|
125
124
|
np.float64: "Float64",
|
126
125
|
np.int64: "Int64",
|
127
126
|
}
|
128
127
|
|
129
128
|
@classmethod
|
130
|
-
def validate_dtype_and_get_kind(cls, dtype:
|
129
|
+
def validate_dtype_and_get_kind(cls, dtype: Any) -> str:
|
131
130
|
"""
|
132
131
|
Validate that the given dtype is supported, and get its CocoIndex kind by dtype.
|
133
132
|
"""
|
@@ -144,41 +143,94 @@ class DtypeRegistry:
|
|
144
143
|
return kind
|
145
144
|
|
146
145
|
|
146
|
+
class AnalyzedAnyType(NamedTuple):
|
147
|
+
"""
|
148
|
+
When the type annotation is missing or matches any type.
|
149
|
+
"""
|
150
|
+
|
151
|
+
|
152
|
+
class AnalyzedBasicType(NamedTuple):
|
153
|
+
"""
|
154
|
+
For types that fit into basic type, and annotated with basic type or Json type.
|
155
|
+
"""
|
156
|
+
|
157
|
+
kind: str
|
158
|
+
|
159
|
+
|
160
|
+
class AnalyzedListType(NamedTuple):
|
161
|
+
"""
|
162
|
+
Any list type, e.g. list[T], Sequence[T], NDArray[T], etc.
|
163
|
+
"""
|
164
|
+
|
165
|
+
elem_type: Any
|
166
|
+
vector_info: VectorInfo | None
|
167
|
+
|
168
|
+
|
169
|
+
class AnalyzedStructType(NamedTuple):
|
170
|
+
"""
|
171
|
+
Any struct type, e.g. dataclass, NamedTuple, etc.
|
172
|
+
"""
|
173
|
+
|
174
|
+
struct_type: type
|
175
|
+
|
176
|
+
|
177
|
+
class AnalyzedUnionType(NamedTuple):
|
178
|
+
"""
|
179
|
+
Any union type, e.g. T1 | T2 | ..., etc.
|
180
|
+
"""
|
181
|
+
|
182
|
+
variant_types: list[Any]
|
183
|
+
|
184
|
+
|
185
|
+
class AnalyzedDictType(NamedTuple):
|
186
|
+
"""
|
187
|
+
Any dict type, e.g. dict[T1, T2], Mapping[T1, T2], etc.
|
188
|
+
"""
|
189
|
+
|
190
|
+
key_type: Any
|
191
|
+
value_type: Any
|
192
|
+
|
193
|
+
|
194
|
+
class AnalyzedUnknownType(NamedTuple):
|
195
|
+
"""
|
196
|
+
Any type that is not supported by CocoIndex.
|
197
|
+
"""
|
198
|
+
|
199
|
+
|
200
|
+
AnalyzedTypeVariant = (
|
201
|
+
AnalyzedAnyType
|
202
|
+
| AnalyzedBasicType
|
203
|
+
| AnalyzedListType
|
204
|
+
| AnalyzedStructType
|
205
|
+
| AnalyzedUnionType
|
206
|
+
| AnalyzedDictType
|
207
|
+
| AnalyzedUnknownType
|
208
|
+
)
|
209
|
+
|
210
|
+
|
147
211
|
@dataclasses.dataclass
|
148
212
|
class AnalyzedTypeInfo:
|
149
213
|
"""
|
150
214
|
Analyzed info of a Python type.
|
151
215
|
"""
|
152
216
|
|
153
|
-
|
217
|
+
# The type without annotations. e.g. int, list[int], dict[str, int]
|
154
218
|
core_type: Any
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
key_type: type | None # For element of KTable
|
159
|
-
struct_type: type | None # For Struct, a dataclass or namedtuple
|
160
|
-
np_number_type: (
|
161
|
-
type | None
|
162
|
-
) # NumPy dtype for the element type, if represented by numpy.ndarray or a NumPy scalar
|
163
|
-
|
219
|
+
# The type without annotations and parameters. e.g. int, list, dict
|
220
|
+
base_type: Any
|
221
|
+
variant: AnalyzedTypeVariant
|
164
222
|
attrs: dict[str, Any] | None
|
165
223
|
nullable: bool = False
|
166
|
-
union_variant_types: typing.List[ElementType] | None = None # For Union
|
167
224
|
|
168
225
|
|
169
226
|
def analyze_type_info(t: Any) -> AnalyzedTypeInfo:
|
170
227
|
"""
|
171
228
|
Analyze a Python type annotation and extract CocoIndex-specific type information.
|
172
|
-
Type annotations for specific CocoIndex types are expected. Raises ValueError for Any, empty, or untyped dict types.
|
173
229
|
"""
|
174
|
-
if isinstance(t, tuple) and len(t) == 2:
|
175
|
-
kt, vt = t
|
176
|
-
result = analyze_type_info(vt)
|
177
|
-
result.key_type = kt
|
178
|
-
return result
|
179
230
|
|
180
231
|
annotations: tuple[Annotation, ...] = ()
|
181
232
|
base_type = None
|
233
|
+
type_args: tuple[Any, ...] = ()
|
182
234
|
nullable = False
|
183
235
|
while True:
|
184
236
|
base_type = typing.get_origin(t)
|
@@ -186,7 +238,12 @@ def analyze_type_info(t: Any) -> AnalyzedTypeInfo:
|
|
186
238
|
annotations = t.__metadata__
|
187
239
|
t = t.__origin__
|
188
240
|
else:
|
241
|
+
if base_type is None:
|
242
|
+
base_type = t
|
243
|
+
else:
|
244
|
+
type_args = typing.get_args(t)
|
189
245
|
break
|
246
|
+
core_type = t
|
190
247
|
|
191
248
|
attrs: dict[str, Any] | None = None
|
192
249
|
vector_info: VectorInfo | None = None
|
@@ -201,74 +258,41 @@ def analyze_type_info(t: Any) -> AnalyzedTypeInfo:
|
|
201
258
|
elif isinstance(attr, TypeKind):
|
202
259
|
kind = attr.kind
|
203
260
|
|
204
|
-
|
205
|
-
elem_type: ElementType | None = None
|
206
|
-
union_variant_types: typing.List[ElementType] | None = None
|
207
|
-
key_type: type | None = None
|
208
|
-
np_number_type: type | None = None
|
209
|
-
if is_struct_type(t):
|
210
|
-
struct_type = t
|
261
|
+
variant: AnalyzedTypeVariant | None = None
|
211
262
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
263
|
+
if kind is not None:
|
264
|
+
variant = AnalyzedBasicType(kind=kind)
|
265
|
+
elif base_type is None or base_type is Any or base_type is inspect.Parameter.empty:
|
266
|
+
variant = AnalyzedAnyType()
|
267
|
+
elif is_struct_type(base_type):
|
268
|
+
variant = AnalyzedStructType(struct_type=t)
|
216
269
|
elif is_numpy_number_type(t):
|
217
|
-
np_number_type = t
|
218
270
|
kind = DtypeRegistry.validate_dtype_and_get_kind(t)
|
271
|
+
variant = AnalyzedBasicType(kind=kind)
|
219
272
|
elif base_type is collections.abc.Sequence or base_type is list:
|
220
|
-
|
221
|
-
elem_type =
|
222
|
-
|
223
|
-
if kind is None:
|
224
|
-
if is_struct_type(elem_type):
|
225
|
-
kind = "LTable"
|
226
|
-
if vector_info is not None:
|
227
|
-
raise ValueError(
|
228
|
-
"Vector element must be a simple type, not a struct"
|
229
|
-
)
|
230
|
-
else:
|
231
|
-
kind = "Vector"
|
232
|
-
if vector_info is None:
|
233
|
-
vector_info = VectorInfo(dim=None)
|
234
|
-
elif not (kind == "Vector" or kind in TABLE_TYPES):
|
235
|
-
raise ValueError(f"Unexpected type kind for list: {kind}")
|
273
|
+
elem_type = type_args[0] if len(type_args) > 0 else None
|
274
|
+
variant = AnalyzedListType(elem_type=elem_type, vector_info=vector_info)
|
236
275
|
elif base_type is np.ndarray:
|
237
|
-
kind = "Vector"
|
238
276
|
np_number_type = t
|
239
|
-
elem_type =
|
240
|
-
|
241
|
-
vector_info = VectorInfo(dim=None) if vector_info is None else vector_info
|
242
|
-
|
277
|
+
elem_type = extract_ndarray_elem_dtype(np_number_type)
|
278
|
+
variant = AnalyzedListType(elem_type=elem_type, vector_info=vector_info)
|
243
279
|
elif base_type is collections.abc.Mapping or base_type is dict or t is dict:
|
244
|
-
|
245
|
-
if len(
|
246
|
-
|
247
|
-
"Untyped dict is not accepted as a specific type annotation; please provide a concrete type, "
|
248
|
-
"e.g. a dataclass or namedtuple for Struct types, a dict[str, T] for KTable types."
|
249
|
-
)
|
250
|
-
else:
|
251
|
-
elem_type = (args[0], args[1])
|
252
|
-
kind = "KTable"
|
280
|
+
key_type = type_args[0] if len(type_args) > 0 else None
|
281
|
+
elem_type = type_args[1] if len(type_args) > 1 else None
|
282
|
+
variant = AnalyzedDictType(key_type=key_type, value_type=elem_type)
|
253
283
|
elif base_type in (types.UnionType, typing.Union):
|
254
|
-
|
255
|
-
non_none_types = [
|
256
|
-
arg for arg in possible_types if arg not in (None, types.NoneType)
|
257
|
-
]
|
258
|
-
|
284
|
+
non_none_types = [arg for arg in type_args if arg not in (None, types.NoneType)]
|
259
285
|
if len(non_none_types) == 0:
|
260
286
|
return analyze_type_info(None)
|
261
287
|
|
262
|
-
nullable = len(non_none_types) < len(
|
263
|
-
|
288
|
+
nullable = len(non_none_types) < len(type_args)
|
264
289
|
if len(non_none_types) == 1:
|
265
290
|
result = analyze_type_info(non_none_types[0])
|
266
291
|
result.nullable = nullable
|
267
292
|
return result
|
268
293
|
|
269
|
-
|
270
|
-
|
271
|
-
elif kind is None:
|
294
|
+
variant = AnalyzedUnionType(variant_types=non_none_types)
|
295
|
+
else:
|
272
296
|
if t is bytes:
|
273
297
|
kind = "Bytes"
|
274
298
|
elif t is str:
|
@@ -293,25 +317,21 @@ def analyze_type_info(t: Any) -> AnalyzedTypeInfo:
|
|
293
317
|
raise ValueError(
|
294
318
|
f"Unsupported as a specific type annotation for CocoIndex data type (https://cocoindex.io/docs/core/data_types): {t}"
|
295
319
|
)
|
320
|
+
variant = AnalyzedBasicType(kind=kind)
|
296
321
|
|
297
322
|
return AnalyzedTypeInfo(
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
elem_type=elem_type,
|
302
|
-
union_variant_types=union_variant_types,
|
303
|
-
key_type=key_type,
|
304
|
-
struct_type=struct_type,
|
305
|
-
np_number_type=np_number_type,
|
323
|
+
core_type=core_type,
|
324
|
+
base_type=base_type,
|
325
|
+
variant=variant,
|
306
326
|
attrs=attrs,
|
307
327
|
nullable=nullable,
|
308
328
|
)
|
309
329
|
|
310
330
|
|
311
|
-
def
|
331
|
+
def _encode_struct_schema(
|
312
332
|
struct_type: type, key_type: type | None = None
|
313
|
-
) ->
|
314
|
-
|
333
|
+
) -> dict[str, Any]:
|
334
|
+
fields = []
|
315
335
|
|
316
336
|
def add_field(name: str, t: Any) -> None:
|
317
337
|
try:
|
@@ -323,7 +343,7 @@ def _encode_fields_schema(
|
|
323
343
|
)
|
324
344
|
raise
|
325
345
|
type_info["name"] = name
|
326
|
-
|
346
|
+
fields.append(type_info)
|
327
347
|
|
328
348
|
if key_type is not None:
|
329
349
|
add_field(KEY_FIELD_NAME, key_type)
|
@@ -335,45 +355,68 @@ def _encode_fields_schema(
|
|
335
355
|
for name, field_type in struct_type.__annotations__.items():
|
336
356
|
add_field(name, field_type)
|
337
357
|
|
358
|
+
result: dict[str, Any] = {"fields": fields}
|
359
|
+
if doc := inspect.getdoc(struct_type):
|
360
|
+
result["description"] = doc
|
338
361
|
return result
|
339
362
|
|
340
363
|
|
341
364
|
def _encode_type(type_info: AnalyzedTypeInfo) -> dict[str, Any]:
|
342
|
-
|
343
|
-
|
344
|
-
if
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
365
|
+
variant = type_info.variant
|
366
|
+
|
367
|
+
if isinstance(variant, AnalyzedAnyType):
|
368
|
+
raise ValueError("Specific type annotation is expected")
|
369
|
+
|
370
|
+
if isinstance(variant, AnalyzedUnknownType):
|
371
|
+
raise ValueError(f"Unsupported type annotation: {type_info.core_type}")
|
372
|
+
|
373
|
+
if isinstance(variant, AnalyzedBasicType):
|
374
|
+
return {"kind": variant.kind}
|
375
|
+
|
376
|
+
if isinstance(variant, AnalyzedStructType):
|
377
|
+
encoded_type = _encode_struct_schema(variant.struct_type)
|
378
|
+
encoded_type["kind"] = "Struct"
|
379
|
+
return encoded_type
|
380
|
+
|
381
|
+
if isinstance(variant, AnalyzedListType):
|
382
|
+
elem_type_info = analyze_type_info(variant.elem_type)
|
383
|
+
encoded_elem_type = _encode_type(elem_type_info)
|
384
|
+
if isinstance(elem_type_info.variant, AnalyzedStructType):
|
385
|
+
if variant.vector_info is not None:
|
386
|
+
raise ValueError("LTable type must not have a vector info")
|
387
|
+
return {
|
388
|
+
"kind": "LTable",
|
389
|
+
"row": _encode_struct_schema(elem_type_info.variant.struct_type),
|
390
|
+
}
|
391
|
+
else:
|
392
|
+
vector_info = variant.vector_info
|
393
|
+
return {
|
394
|
+
"kind": "Vector",
|
395
|
+
"element_type": encoded_elem_type,
|
396
|
+
"dimension": vector_info and vector_info.dim,
|
397
|
+
}
|
398
|
+
|
399
|
+
if isinstance(variant, AnalyzedDictType):
|
400
|
+
value_type_info = analyze_type_info(variant.value_type)
|
401
|
+
if not isinstance(value_type_info.variant, AnalyzedStructType):
|
402
|
+
raise ValueError(
|
403
|
+
f"KTable value must have a Struct type, got {value_type_info.core_type}"
|
404
|
+
)
|
405
|
+
return {
|
406
|
+
"kind": "KTable",
|
407
|
+
"row": _encode_struct_schema(
|
408
|
+
value_type_info.variant.struct_type,
|
409
|
+
variant.key_type,
|
410
|
+
),
|
411
|
+
}
|
412
|
+
|
413
|
+
if isinstance(variant, AnalyzedUnionType):
|
414
|
+
return {
|
415
|
+
"kind": "Union",
|
416
|
+
"types": [
|
417
|
+
_encode_type(analyze_type_info(typ)) for typ in variant.variant_types
|
418
|
+
],
|
419
|
+
}
|
377
420
|
|
378
421
|
|
379
422
|
def encode_enriched_type_info(enriched_type_info: AnalyzedTypeInfo) -> dict[str, Any]:
|
@@ -1,12 +1,12 @@
|
|
1
|
-
cocoindex-0.1.
|
2
|
-
cocoindex-0.1.
|
3
|
-
cocoindex-0.1.
|
4
|
-
cocoindex-0.1.
|
1
|
+
cocoindex-0.1.73.dist-info/METADATA,sha256=7TqVP8FrHbi9wz-XrnSYX2C158sVJV-SveG7VmXZN6k,11304
|
2
|
+
cocoindex-0.1.73.dist-info/WHEEL,sha256=4POUqOUvk-fNEqEa1NBlmMsgWQGl6FnEg9vsbsvEmNM,104
|
3
|
+
cocoindex-0.1.73.dist-info/entry_points.txt,sha256=_NretjYVzBdNTn7dK-zgwr7YfG2afz1u1uSE-5bZXF8,46
|
4
|
+
cocoindex-0.1.73.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
5
5
|
cocoindex/__init__.py,sha256=kfTgbh2haepo7kIbzJqfxU6Kx7wPol5_t1SYF2x6cBM,2114
|
6
|
-
cocoindex/_engine.cpython-311-darwin.so,sha256=
|
6
|
+
cocoindex/_engine.cpython-311-darwin.so,sha256=v_QXKoyz2HFUWnf4niLprUuWRMGHeblTjVmgRoebRag,65084960
|
7
7
|
cocoindex/auth_registry.py,sha256=PE1-kVkcyC1G2C_V7b1kvYzeq73OFQehWKQP7ln7fJ8,1478
|
8
8
|
cocoindex/cli.py,sha256=-gp639JSyQN6YjnhGqCakIzYoSSqXxQMbxbkcYGP0QY,22359
|
9
|
-
cocoindex/convert.py,sha256=
|
9
|
+
cocoindex/convert.py,sha256=ZENKZ47Vmah2_EEvE03WqfDF9wCs9h0CDEjq08GK3R0,17365
|
10
10
|
cocoindex/flow.py,sha256=HN24rsihO3BkSYGnTtxgovgka2IobxhFuLmDlqw3fAk,36127
|
11
11
|
cocoindex/functions.py,sha256=LLu_ausirvqnsx_k3euZpv8sLCpBZ4DF77h2HOzbinE,3109
|
12
12
|
cocoindex/index.py,sha256=j93B9jEvvLXHtpzKWL88SY6wCGEoPgpsQhEGHlyYGFg,540
|
@@ -20,11 +20,11 @@ cocoindex/setup.py,sha256=7uIHKN4FOCuoidPXcKyGTrkqpkl9luL49-6UcnMxYzw,3068
|
|
20
20
|
cocoindex/sources.py,sha256=69COA4qbZDipzGYfXv-WJSmicFkA509xIShRGDh6A0A,2083
|
21
21
|
cocoindex/targets.py,sha256=Nfh_tpFd1goTnS_cxBjIs4j9zl3Z4Z1JomAQ1dl3Sic,2796
|
22
22
|
cocoindex/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
|
-
cocoindex/tests/test_convert.py,sha256=
|
23
|
+
cocoindex/tests/test_convert.py,sha256=Ofx0grI-tIWCkefwS8XMTQlQvDDV0YI1fjx5ZhUwRZs,49738
|
24
24
|
cocoindex/tests/test_optional_database.py,sha256=snAmkNa6wtOSaxoZE1HgjvL5v_ylitt3Jt_9df4Cgdc,8506
|
25
|
-
cocoindex/tests/test_typing.py,sha256=
|
25
|
+
cocoindex/tests/test_typing.py,sha256=MeirjvSVlMqIJsvLF0B11EYpczi6o7WsJMS2hdHry5c,12636
|
26
26
|
cocoindex/tests/test_validation.py,sha256=X6AQzVs-hVKIXcrHMEMQnhfUE8at7iXQnPq8nHNhZ2Q,4543
|
27
|
-
cocoindex/typing.py,sha256=
|
27
|
+
cocoindex/typing.py,sha256=9g-pV1O-CUnUQwzE22nPHVUTY6Zrr-ChzAEq4TVGAig,13487
|
28
28
|
cocoindex/utils.py,sha256=hUhX-XV6XGCtJSEIpBOuDv6VvqImwPlgBxztBTw7u0U,598
|
29
29
|
cocoindex/validation.py,sha256=PZnJoby4sLbsmPv9fOjOQXuefjfZ7gmtsiTGU8SH-tc,3090
|
30
|
-
cocoindex-0.1.
|
30
|
+
cocoindex-0.1.73.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|