cocoindex 0.1.72__cp312-cp312-macosx_11_0_arm64.whl → 0.1.74__cp312-cp312-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/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
- # Use NDArray for supported numeric dtypes, else list
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
- if dtype in DtypeRegistry._DTYPE_TO_KIND:
84
- return Annotated[NDArray[dtype], VectorInfo(dim=dim_val)]
85
- return Annotated[list[dtype], VectorInfo(dim=dim_val)]
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 extract_ndarray_scalar_dtype(ndarray_type: Any) -> Any:
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.number)
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: ElementType | None) -> bool:
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[ElementType, str] = {
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: ElementType) -> str:
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
- kind: str
217
+ # The type without annotations. e.g. int, list[int], dict[str, int]
154
218
  core_type: Any
155
- vector_info: VectorInfo | None # For Vector
156
- elem_type: ElementType | None # For Vector and Table
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
- struct_type: type | None = None
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
- if kind is None:
213
- kind = "Struct"
214
- elif kind != "Struct":
215
- raise ValueError(f"Unexpected type kind for struct: {kind}")
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
- args = typing.get_args(t)
221
- elem_type = args[0]
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 = extract_ndarray_scalar_dtype(np_number_type)
240
- _ = DtypeRegistry.validate_dtype_and_get_kind(elem_type)
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
- args = typing.get_args(t)
245
- if len(args) == 0: # Handle untyped dict
246
- raise ValueError(
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
- possible_types = typing.get_args(t)
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(possible_types)
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
- kind = "Union"
270
- union_variant_types = non_none_types
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:
@@ -289,29 +313,25 @@ def analyze_type_info(t: Any) -> AnalyzedTypeInfo:
289
313
  kind = "OffsetDateTime"
290
314
  elif t is datetime.timedelta:
291
315
  kind = "TimeDelta"
316
+
317
+ if kind is None:
318
+ variant = AnalyzedUnknownType()
292
319
  else:
293
- raise ValueError(
294
- f"Unsupported as a specific type annotation for CocoIndex data type (https://cocoindex.io/docs/core/data_types): {t}"
295
- )
320
+ variant = AnalyzedBasicType(kind=kind)
296
321
 
297
322
  return AnalyzedTypeInfo(
298
- kind=kind,
299
- core_type=t,
300
- vector_info=vector_info,
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 _encode_fields_schema(
331
+ def _encode_struct_schema(
312
332
  struct_type: type, key_type: type | None = None
313
- ) -> list[dict[str, Any]]:
314
- result = []
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
- result.append(type_info)
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
- encoded_type: dict[str, Any] = {"kind": type_info.kind}
343
-
344
- if type_info.kind == "Struct":
345
- if type_info.struct_type is None:
346
- raise ValueError("Struct type must have a dataclass or namedtuple type")
347
- encoded_type["fields"] = _encode_fields_schema(
348
- type_info.struct_type, type_info.key_type
349
- )
350
- if doc := inspect.getdoc(type_info.struct_type):
351
- encoded_type["description"] = doc
352
-
353
- elif type_info.kind == "Vector":
354
- if type_info.vector_info is None:
355
- raise ValueError("Vector type must have a vector info")
356
- if type_info.elem_type is None:
357
- raise ValueError("Vector type must have an element type")
358
- elem_type_info = analyze_type_info(type_info.elem_type)
359
- encoded_type["element_type"] = _encode_type(elem_type_info)
360
- encoded_type["dimension"] = type_info.vector_info.dim
361
-
362
- elif type_info.kind == "Union":
363
- if type_info.union_variant_types is None:
364
- raise ValueError("Union type must have a variant type list")
365
- encoded_type["types"] = [
366
- _encode_type(analyze_type_info(typ))
367
- for typ in type_info.union_variant_types
368
- ]
369
-
370
- elif type_info.kind in TABLE_TYPES:
371
- if type_info.elem_type is None:
372
- raise ValueError(f"{type_info.kind} type must have an element type")
373
- row_type_info = analyze_type_info(type_info.elem_type)
374
- encoded_type["row"] = _encode_type(row_type_info)
375
-
376
- return encoded_type
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cocoindex
3
- Version: 0.1.72
3
+ Version: 0.1.74
4
4
  Requires-Dist: click>=8.1.8
5
5
  Requires-Dist: rich>=14.0.0
6
6
  Requires-Dist: python-dotenv>=1.1.0
@@ -11,7 +11,7 @@ Requires-Dist: ruff ; extra == 'dev'
11
11
  Requires-Dist: mypy ; extra == 'dev'
12
12
  Requires-Dist: pre-commit ; extra == 'dev'
13
13
  Requires-Dist: sentence-transformers>=3.3.1 ; extra == 'embeddings'
14
- Requires-Dist: cocoindex[embeddings] ; extra == 'all'
14
+ Requires-Dist: sentence-transformers>=3.3.1 ; extra == 'all'
15
15
  Provides-Extra: dev
16
16
  Provides-Extra: embeddings
17
17
  Provides-Extra: all
@@ -1,18 +1,18 @@
1
- cocoindex-0.1.72.dist-info/METADATA,sha256=ztXY--5U2oGAPvJlh-fGpYTFcrhoAg3AhaOX78sZACI,11304
2
- cocoindex-0.1.72.dist-info/WHEEL,sha256=OKNaprf69OMJcUM9j7q_InsmuCwJKmTkk4eP74FSm7I,104
3
- cocoindex-0.1.72.dist-info/entry_points.txt,sha256=_NretjYVzBdNTn7dK-zgwr7YfG2afz1u1uSE-5bZXF8,46
4
- cocoindex-0.1.72.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1
+ cocoindex-0.1.74.dist-info/METADATA,sha256=kkA1L7X7ypbNcSLBtJ92Zp1lYEgEJEfXpR1d1c8V_Lw,11311
2
+ cocoindex-0.1.74.dist-info/WHEEL,sha256=OKNaprf69OMJcUM9j7q_InsmuCwJKmTkk4eP74FSm7I,104
3
+ cocoindex-0.1.74.dist-info/entry_points.txt,sha256=_NretjYVzBdNTn7dK-zgwr7YfG2afz1u1uSE-5bZXF8,46
4
+ cocoindex-0.1.74.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
5
5
  cocoindex/__init__.py,sha256=kfTgbh2haepo7kIbzJqfxU6Kx7wPol5_t1SYF2x6cBM,2114
6
- cocoindex/_engine.cpython-312-darwin.so,sha256=UDnD-pTw4FM_n8z36-bsXkqDQxB8GMkdjNHB6gAIBUM,65036560
6
+ cocoindex/_engine.cpython-312-darwin.so,sha256=W4HyBmzAOdZZ26qLh7QeFKtwRwW1U9vsW6PgWJrMzQo,65097888
7
7
  cocoindex/auth_registry.py,sha256=PE1-kVkcyC1G2C_V7b1kvYzeq73OFQehWKQP7ln7fJ8,1478
8
8
  cocoindex/cli.py,sha256=-gp639JSyQN6YjnhGqCakIzYoSSqXxQMbxbkcYGP0QY,22359
9
- cocoindex/convert.py,sha256=fOzfbMlQ8WQ_nAv8WpX-EEHdZdBV8QXV3qIe1_Ird_U,15806
10
- cocoindex/flow.py,sha256=HN24rsihO3BkSYGnTtxgovgka2IobxhFuLmDlqw3fAk,36127
9
+ cocoindex/convert.py,sha256=jO95WD8X7AYS5COfRyPiq4t7ewVC1TdRbYpTdHrkCvY,19564
10
+ cocoindex/flow.py,sha256=C2VwexNxes_7b70jhlp5yAPeBQPtdbKabOp1AarsacA,36184
11
11
  cocoindex/functions.py,sha256=LLu_ausirvqnsx_k3euZpv8sLCpBZ4DF77h2HOzbinE,3109
12
12
  cocoindex/index.py,sha256=j93B9jEvvLXHtpzKWL88SY6wCGEoPgpsQhEGHlyYGFg,540
13
13
  cocoindex/lib.py,sha256=f--9dAYd84CZosbDZqNW0oGbBLsY3dXiUTR1VrfQ_QY,817
14
14
  cocoindex/llm.py,sha256=WxmWUbNcf9HOCM5xkbDeFs9lF67M3mr810B7deDDc-8,673
15
- cocoindex/op.py,sha256=Afi5CfgU3wPQoPPKFb2WUYCVLmCPhBuK-2NT1AzC2zU,13161
15
+ cocoindex/op.py,sha256=DNAlZGpGFZWAfRFuxXKmT72kSORdGbirDYsSlD7sDqk,21474
16
16
  cocoindex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  cocoindex/runtime.py,sha256=povilB3HH3y1JF-yxKwU-pD8n2WnAqyQxIgvXXHNc60,1080
18
18
  cocoindex/setting.py,sha256=TwhQ6pEeZmvc8ZXlnT9d8Wn8Vz_u7Z5LJUkGsKmKSno,4859
@@ -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=CnPDAK8QdzWTS9II-prbwIHeiq5htvRFhkfR8YdUE10,48960
23
+ cocoindex/tests/test_convert.py,sha256=guQ6-AJh4z1NoR60wlm0lJ2R-rOstmFDihDL2oYGouI,46875
24
24
  cocoindex/tests/test_optional_database.py,sha256=snAmkNa6wtOSaxoZE1HgjvL5v_ylitt3Jt_9df4Cgdc,8506
25
- cocoindex/tests/test_typing.py,sha256=NB4nUzoumOF_wGFa4D2Xf6d0bUVtOiSXyb78M1pYSG4,14827
25
+ cocoindex/tests/test_typing.py,sha256=9OF3lO2uSpZBefkEJx7WRbnkXjwQtvlQIeeARYQID68,12391
26
26
  cocoindex/tests/test_validation.py,sha256=X6AQzVs-hVKIXcrHMEMQnhfUE8at7iXQnPq8nHNhZ2Q,4543
27
- cocoindex/typing.py,sha256=MO9HkrNpargvMPvpkd7jgSu2R-21KE_NaB9-WI4YOZA,13241
27
+ cocoindex/typing.py,sha256=RK-UYiNkxL9DPjhitFeJVB0b3eV2DsGjOg8V-jrnUYU,13383
28
28
  cocoindex/utils.py,sha256=hUhX-XV6XGCtJSEIpBOuDv6VvqImwPlgBxztBTw7u0U,598
29
29
  cocoindex/validation.py,sha256=PZnJoby4sLbsmPv9fOjOQXuefjfZ7gmtsiTGU8SH-tc,3090
30
- cocoindex-0.1.72.dist-info/RECORD,,
30
+ cocoindex-0.1.74.dist-info/RECORD,,