cocoindex 0.1.43__cp311-cp311-macosx_11_0_arm64.whl → 0.1.45__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/typing.py CHANGED
@@ -5,14 +5,28 @@ import datetime
5
5
  import types
6
6
  import inspect
7
7
  import uuid
8
- from typing import Annotated, NamedTuple, Any, TypeVar, TYPE_CHECKING, overload, Sequence, Protocol, Generic, Literal
8
+ from typing import (
9
+ Annotated,
10
+ NamedTuple,
11
+ Any,
12
+ TypeVar,
13
+ TYPE_CHECKING,
14
+ overload,
15
+ Sequence,
16
+ Generic,
17
+ Literal,
18
+ Protocol,
19
+ )
20
+
9
21
 
10
22
  class VectorInfo(NamedTuple):
11
23
  dim: int | None
12
24
 
25
+
13
26
  class TypeKind(NamedTuple):
14
27
  kind: str
15
28
 
29
+
16
30
  class TypeAttr:
17
31
  key: str
18
32
  value: Any
@@ -21,24 +35,31 @@ class TypeAttr:
21
35
  self.key = key
22
36
  self.value = value
23
37
 
38
+
24
39
  Annotation = TypeKind | TypeAttr | VectorInfo
25
40
 
26
- Float32 = Annotated[float, TypeKind('Float32')]
27
- Float64 = Annotated[float, TypeKind('Float64')]
28
- Range = Annotated[tuple[int, int], TypeKind('Range')]
29
- Json = Annotated[Any, TypeKind('Json')]
30
- LocalDateTime = Annotated[datetime.datetime, TypeKind('LocalDateTime')]
31
- OffsetDateTime = Annotated[datetime.datetime, TypeKind('OffsetDateTime')]
41
+ Float32 = Annotated[float, TypeKind("Float32")]
42
+ Float64 = Annotated[float, TypeKind("Float64")]
43
+ Range = Annotated[tuple[int, int], TypeKind("Range")]
44
+ Json = Annotated[Any, TypeKind("Json")]
45
+ LocalDateTime = Annotated[datetime.datetime, TypeKind("LocalDateTime")]
46
+ OffsetDateTime = Annotated[datetime.datetime, TypeKind("OffsetDateTime")]
32
47
 
33
48
  if TYPE_CHECKING:
34
- T_co = TypeVar('T_co', covariant=True)
35
- Dim_co = TypeVar('Dim_co', bound=int, covariant=True)
49
+ T_co = TypeVar("T_co", covariant=True)
50
+ Dim_co = TypeVar("Dim_co", bound=int, covariant=True)
36
51
 
37
- class Vector(Sequence[T_co], Generic[T_co, Dim_co], Protocol):
52
+ class Vector(Protocol, Generic[T_co, Dim_co]):
38
53
  """Vector[T, Dim] is a special typing alias for a list[T] with optional dimension info"""
54
+
55
+ def __getitem__(self, index: int) -> T_co: ...
56
+ def __len__(self) -> int: ...
57
+
39
58
  else:
59
+
40
60
  class Vector: # type: ignore[unreachable]
41
- """ A special typing alias for a list[T] with optional dimension info """
61
+ """A special typing alias for a list[T] with optional dimension info"""
62
+
42
63
  def __class_getitem__(self, params):
43
64
  if not isinstance(params, tuple):
44
65
  # Only element type provided
@@ -51,40 +72,48 @@ else:
51
72
  dim = typing.get_args(dim)[0] # Extract the literal value
52
73
  return Annotated[list[elem_type], VectorInfo(dim=dim)]
53
74
 
54
- TABLE_TYPES = ('KTable', 'LTable')
55
- KEY_FIELD_NAME = '_key'
75
+
76
+ TABLE_TYPES: tuple[str, str] = ("KTable", "LTable")
77
+ KEY_FIELD_NAME: str = "_key"
56
78
 
57
79
  ElementType = type | tuple[type, type]
58
80
 
59
- def is_namedtuple_type(t) -> bool:
81
+
82
+ def is_namedtuple_type(t: type) -> bool:
60
83
  return isinstance(t, type) and issubclass(t, tuple) and hasattr(t, "_fields")
61
84
 
62
- def _is_struct_type(t) -> bool:
63
- return isinstance(t, type) and (dataclasses.is_dataclass(t) or is_namedtuple_type(t))
85
+
86
+ def _is_struct_type(t: ElementType | None) -> bool:
87
+ return isinstance(t, type) and (
88
+ dataclasses.is_dataclass(t) or is_namedtuple_type(t)
89
+ )
90
+
64
91
 
65
92
  @dataclasses.dataclass
66
93
  class AnalyzedTypeInfo:
67
94
  """
68
95
  Analyzed info of a Python type.
69
96
  """
97
+
70
98
  kind: str
71
99
  vector_info: VectorInfo | None # For Vector
72
- elem_type: ElementType | None # For Vector and Table
100
+ elem_type: ElementType | None # For Vector and Table
73
101
 
74
- key_type: type | None # For element of KTable
75
- struct_type: type | None # For Struct, a dataclass or namedtuple
102
+ key_type: type | None # For element of KTable
103
+ struct_type: type | None # For Struct, a dataclass or namedtuple
76
104
 
77
105
  attrs: dict[str, Any] | None
78
106
  nullable: bool = False
79
107
 
80
- def analyze_type_info(t) -> AnalyzedTypeInfo:
108
+
109
+ def analyze_type_info(t: Any) -> AnalyzedTypeInfo:
81
110
  """
82
111
  Analyze a Python type and return the analyzed info.
83
112
  """
84
113
  if isinstance(t, tuple) and len(t) == 2:
85
- key_type, value_type = t
86
- result = analyze_type_info(value_type)
87
- result.key_type = key_type
114
+ kt, vt = t
115
+ result = analyze_type_info(vt)
116
+ result.key_type = kt
88
117
  return result
89
118
 
90
119
  annotations: tuple[Annotation, ...] = ()
@@ -97,19 +126,22 @@ def analyze_type_info(t) -> AnalyzedTypeInfo:
97
126
  t = t.__origin__
98
127
  elif base_type is types.UnionType:
99
128
  possible_types = typing.get_args(t)
100
- non_none_types = [arg for arg in possible_types if arg not in (None, types.NoneType)]
129
+ non_none_types = [
130
+ arg for arg in possible_types if arg not in (None, types.NoneType)
131
+ ]
101
132
  if len(non_none_types) != 1:
102
133
  raise ValueError(
103
- f"Expect exactly one non-None choice for Union type, but got {len(non_none_types)}: {t}")
134
+ f"Expect exactly one non-None choice for Union type, but got {len(non_none_types)}: {t}"
135
+ )
104
136
  t = non_none_types[0]
105
137
  if len(possible_types) > 1:
106
138
  nullable = True
107
139
  else:
108
140
  break
109
141
 
110
- attrs = None
111
- vector_info = None
112
- kind = None
142
+ attrs: dict[str, Any] | None = None
143
+ vector_info: VectorInfo | None = None
144
+ kind: str | None = None
113
145
  for attr in annotations:
114
146
  if isinstance(attr, TypeAttr):
115
147
  if attrs is None:
@@ -120,15 +152,15 @@ def analyze_type_info(t) -> AnalyzedTypeInfo:
120
152
  elif isinstance(attr, TypeKind):
121
153
  kind = attr.kind
122
154
 
123
- struct_type = None
124
- elem_type = None
125
- key_type = None
155
+ struct_type: type | None = None
156
+ elem_type: ElementType | None = None
157
+ key_type: type | None = None
126
158
  if _is_struct_type(t):
127
159
  struct_type = t
128
160
 
129
161
  if kind is None:
130
- kind = 'Struct'
131
- elif kind != 'Struct':
162
+ kind = "Struct"
163
+ elif kind != "Struct":
132
164
  raise ValueError(f"Unexpected type kind for struct: {kind}")
133
165
  elif base_type is collections.abc.Sequence or base_type is list:
134
166
  args = typing.get_args(t)
@@ -136,40 +168,42 @@ def analyze_type_info(t) -> AnalyzedTypeInfo:
136
168
 
137
169
  if kind is None:
138
170
  if _is_struct_type(elem_type):
139
- kind = 'LTable'
171
+ kind = "LTable"
140
172
  if vector_info is not None:
141
- raise ValueError("Vector element must be a simple type, not a struct")
173
+ raise ValueError(
174
+ "Vector element must be a simple type, not a struct"
175
+ )
142
176
  else:
143
- kind = 'Vector'
177
+ kind = "Vector"
144
178
  if vector_info is None:
145
179
  vector_info = VectorInfo(dim=None)
146
- elif not (kind == 'Vector' or kind in TABLE_TYPES):
180
+ elif not (kind == "Vector" or kind in TABLE_TYPES):
147
181
  raise ValueError(f"Unexpected type kind for list: {kind}")
148
182
  elif base_type is collections.abc.Mapping or base_type is dict:
149
183
  args = typing.get_args(t)
150
184
  elem_type = (args[0], args[1])
151
- kind = 'KTable'
185
+ kind = "KTable"
152
186
  elif kind is None:
153
187
  if t is bytes:
154
- kind = 'Bytes'
188
+ kind = "Bytes"
155
189
  elif t is str:
156
- kind = 'Str'
190
+ kind = "Str"
157
191
  elif t is bool:
158
- kind = 'Bool'
192
+ kind = "Bool"
159
193
  elif t is int:
160
- kind = 'Int64'
194
+ kind = "Int64"
161
195
  elif t is float:
162
- kind = 'Float64'
196
+ kind = "Float64"
163
197
  elif t is uuid.UUID:
164
- kind = 'Uuid'
198
+ kind = "Uuid"
165
199
  elif t is datetime.date:
166
- kind = 'Date'
200
+ kind = "Date"
167
201
  elif t is datetime.time:
168
- kind = 'Time'
202
+ kind = "Time"
169
203
  elif t is datetime.datetime:
170
- kind = 'OffsetDateTime'
204
+ kind = "OffsetDateTime"
171
205
  elif t is datetime.timedelta:
172
- kind = 'TimeDelta'
206
+ kind = "TimeDelta"
173
207
  else:
174
208
  raise ValueError(f"type unsupported yet: {t}")
175
209
 
@@ -183,9 +217,13 @@ def analyze_type_info(t) -> AnalyzedTypeInfo:
183
217
  nullable=nullable,
184
218
  )
185
219
 
186
- def _encode_fields_schema(struct_type: type, key_type: type | None = None) -> list[dict[str, Any]]:
220
+
221
+ def _encode_fields_schema(
222
+ struct_type: type, key_type: type | None = None
223
+ ) -> list[dict[str, Any]]:
187
224
  result = []
188
- def add_field(name: str, t) -> None:
225
+
226
+ def add_field(name: str, t: Any) -> None:
189
227
  try:
190
228
  type_info = encode_enriched_type_info(analyze_type_info(t))
191
229
  except ValueError as e:
@@ -194,7 +232,7 @@ def _encode_fields_schema(struct_type: type, key_type: type | None = None) -> li
194
232
  f"{struct_type.__name__}.{name}: {t}"
195
233
  )
196
234
  raise
197
- type_info['name'] = name
235
+ type_info["name"] = name
198
236
  result.append(type_info)
199
237
 
200
238
  if key_type is not None:
@@ -209,55 +247,62 @@ def _encode_fields_schema(struct_type: type, key_type: type | None = None) -> li
209
247
 
210
248
  return result
211
249
 
250
+
212
251
  def _encode_type(type_info: AnalyzedTypeInfo) -> dict[str, Any]:
213
- encoded_type: dict[str, Any] = { 'kind': type_info.kind }
252
+ encoded_type: dict[str, Any] = {"kind": type_info.kind}
214
253
 
215
- if type_info.kind == 'Struct':
254
+ if type_info.kind == "Struct":
216
255
  if type_info.struct_type is None:
217
256
  raise ValueError("Struct type must have a dataclass or namedtuple type")
218
- encoded_type['fields'] = _encode_fields_schema(type_info.struct_type, type_info.key_type)
257
+ encoded_type["fields"] = _encode_fields_schema(
258
+ type_info.struct_type, type_info.key_type
259
+ )
219
260
  if doc := inspect.getdoc(type_info.struct_type):
220
- encoded_type['description'] = doc
261
+ encoded_type["description"] = doc
221
262
 
222
- elif type_info.kind == 'Vector':
263
+ elif type_info.kind == "Vector":
223
264
  if type_info.vector_info is None:
224
265
  raise ValueError("Vector type must have a vector info")
225
266
  if type_info.elem_type is None:
226
267
  raise ValueError("Vector type must have an element type")
227
- encoded_type['element_type'] = _encode_type(analyze_type_info(type_info.elem_type))
228
- encoded_type['dimension'] = type_info.vector_info.dim
268
+ encoded_type["element_type"] = _encode_type(
269
+ analyze_type_info(type_info.elem_type)
270
+ )
271
+ encoded_type["dimension"] = type_info.vector_info.dim
229
272
 
230
273
  elif type_info.kind in TABLE_TYPES:
231
274
  if type_info.elem_type is None:
232
275
  raise ValueError(f"{type_info.kind} type must have an element type")
233
276
  row_type_info = analyze_type_info(type_info.elem_type)
234
- encoded_type['row'] = _encode_type(row_type_info)
277
+ encoded_type["row"] = _encode_type(row_type_info)
235
278
 
236
279
  return encoded_type
237
280
 
281
+
238
282
  def encode_enriched_type_info(enriched_type_info: AnalyzedTypeInfo) -> dict[str, Any]:
239
283
  """
240
284
  Encode an enriched type info to a CocoIndex engine's type representation
241
285
  """
242
- encoded: dict[str, Any] = {'type': _encode_type(enriched_type_info)}
286
+ encoded: dict[str, Any] = {"type": _encode_type(enriched_type_info)}
243
287
 
244
288
  if enriched_type_info.attrs is not None:
245
- encoded['attrs'] = enriched_type_info.attrs
289
+ encoded["attrs"] = enriched_type_info.attrs
246
290
 
247
291
  if enriched_type_info.nullable:
248
- encoded['nullable'] = True
292
+ encoded["nullable"] = True
249
293
 
250
294
  return encoded
251
295
 
296
+
252
297
  @overload
253
- def encode_enriched_type(t: None) -> None:
254
- ...
298
+ def encode_enriched_type(t: None) -> None: ...
299
+
255
300
 
256
301
  @overload
257
- def encode_enriched_type(t: Any) -> dict[str, Any]:
258
- ...
302
+ def encode_enriched_type(t: Any) -> dict[str, Any]: ...
259
303
 
260
- def encode_enriched_type(t) -> dict[str, Any] | None:
304
+
305
+ def encode_enriched_type(t: Any) -> dict[str, Any] | None:
261
306
  """
262
307
  Convert a Python type to a CocoIndex engine's type representation
263
308
  """
@@ -266,7 +311,8 @@ def encode_enriched_type(t) -> dict[str, Any] | None:
266
311
 
267
312
  return encode_enriched_type_info(analyze_type_info(t))
268
313
 
269
- def resolve_forward_ref(t):
270
- if t is str:
271
- return eval(t) # pylint: disable=eval-used
314
+
315
+ def resolve_forward_ref(t: Any) -> Any:
316
+ if isinstance(t, str):
317
+ return eval(t) # pylint: disable=eval-used
272
318
  return t
cocoindex/utils.py CHANGED
@@ -1,9 +1,17 @@
1
1
  from .flow import Flow
2
2
  from .setting import get_app_namespace
3
3
 
4
- def get_target_storage_default_name(flow: Flow, target_name: str, delimiter: str = "__") -> str:
4
+
5
+ def get_target_storage_default_name(
6
+ flow: Flow, target_name: str, delimiter: str = "__"
7
+ ) -> str:
5
8
  """
6
9
  Get the default name for a target.
7
10
  It's used as the underlying storage name (e.g. a table, a collection, etc.) followed by most storage backends, if not explicitly specified.
8
11
  """
9
- return get_app_namespace(trailing_delimiter=delimiter) + flow.name + delimiter + target_name
12
+ return (
13
+ get_app_namespace(trailing_delimiter=delimiter)
14
+ + flow.name
15
+ + delimiter
16
+ + target_name
17
+ )
@@ -1,12 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cocoindex
3
- Version: 0.1.43
3
+ Version: 0.1.45
4
4
  Requires-Dist: sentence-transformers>=3.3.1
5
5
  Requires-Dist: click>=8.1.8
6
6
  Requires-Dist: rich>=14.0.0
7
7
  Requires-Dist: python-dotenv>=1.1.0
8
8
  Requires-Dist: pytest ; extra == 'test'
9
+ Requires-Dist: ruff ; extra == 'dev'
9
10
  Provides-Extra: test
11
+ Provides-Extra: dev
10
12
  License-File: LICENSE
11
13
  Summary: With CocoIndex, users declare the transformation, CocoIndex creates & maintains an index, and keeps the derived index up to date based on source update, with minimal computation and changes.
12
14
  Author-email: CocoIndex <cocoindex.io@gmail.com>
@@ -0,0 +1,27 @@
1
+ cocoindex-0.1.45.dist-info/METADATA,sha256=P5VaQGACoY6m-WQesaWvt5r3bIyolevTxnuCLtJqomY,9875
2
+ cocoindex-0.1.45.dist-info/WHEEL,sha256=p_tvkyHH2UmMBrR2Gemb1ahXJMM2SXUIsCLrWZgJvB8,104
3
+ cocoindex-0.1.45.dist-info/entry_points.txt,sha256=_NretjYVzBdNTn7dK-zgwr7YfG2afz1u1uSE-5bZXF8,46
4
+ cocoindex-0.1.45.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
5
+ cocoindex/__init__.py,sha256=TkfOR-7upXpzETEvBQUhcnYVuI_A3sqjOdXYeTPAwO0,818
6
+ cocoindex/_engine.cpython-311-darwin.so,sha256=Es24pgfBaRIMVjOUSa1AeJEXf19cCJB9M3uQRqaXLwY,57128576
7
+ cocoindex/auth_registry.py,sha256=1XqO7ibjmBBd8i11XSJTvTgdz8p1ptW-ZpuSgo_5zzk,716
8
+ cocoindex/cli.py,sha256=p92s-Ya6VpT4EY5xfbl-R0yyIJv8ySK-2eyxnwC8KqA,17853
9
+ cocoindex/convert.py,sha256=CfsZDRs1kwMeNCeJ3-gifHQm_9GzyqySpUmZyCyWXMo,7316
10
+ cocoindex/flow.py,sha256=sC7eg0L9MkZuo7MlvGA4eYe-mEReIyPjKIILFtkWm-Y,30017
11
+ cocoindex/functions.py,sha256=rjULmc14tL8-eU-tSmgyc867C_nySS2hktyj8NgofI8,1972
12
+ cocoindex/index.py,sha256=j93B9jEvvLXHtpzKWL88SY6wCGEoPgpsQhEGHlyYGFg,540
13
+ cocoindex/lib.py,sha256=W3hPh0QQIjLRRe2tpyLCvL_6ajzXhGGSNJubikkS27s,2985
14
+ cocoindex/llm.py,sha256=KO-R4mrAWtxXD82-Yv5ixpkKMVfkwpbdWwqPVZygLu4,352
15
+ cocoindex/op.py,sha256=hOJoHC8elhLHMNVRTGTBWNSK5uYrQb-FfRV-qt08j8g,11815
16
+ cocoindex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ cocoindex/query.py,sha256=UswtEp0wZwwNPeR9x9lRokFpNNZOHkyt5tYfCmGIWWU,3450
18
+ cocoindex/runtime.py,sha256=bAdHYaXFWiiUWyAgzmKTeaAaRR0D_AmaqVCIdPO-v00,1056
19
+ cocoindex/setting.py,sha256=ePqHw1i95rVtqYYRVqzVwtBifRO4SfH1rlMW_AG3Zek,3418
20
+ cocoindex/setup.py,sha256=u5dYZFKfz4yZLiGHD0guNaR0s4zY9JAoZWrWHpAHw_0,773
21
+ cocoindex/sources.py,sha256=JCnOhv1w4o28e03i7yvo4ESicWYAhckkBg5bQlxNH4U,1330
22
+ cocoindex/storages.py,sha256=RCS1YrtSIKjkWX5JHF38hK85SNn5BhsRU1gqyzbHn30,2688
23
+ cocoindex/tests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
24
+ cocoindex/tests/test_convert.py,sha256=tTsDveMCgflhcYmDq-fQq3MRGAmN2xlbtFIEDYlRpGw,17095
25
+ cocoindex/typing.py,sha256=0WQ4F04kFhXwHphv9AHJqc1cThYmLe27eqqGEuGWHAU,9462
26
+ cocoindex/utils.py,sha256=5a3ubVzDowJUJyUl8ecd75Th_OzON3G-MV2vXf0dQSk,503
27
+ cocoindex-0.1.45.dist-info/RECORD,,
@@ -1,27 +0,0 @@
1
- cocoindex-0.1.43.dist-info/METADATA,sha256=2n3yADdVbrbv-m-x7qtZX8l8D_2h37MEP2tY5OqTyBo,9818
2
- cocoindex-0.1.43.dist-info/WHEEL,sha256=p_tvkyHH2UmMBrR2Gemb1ahXJMM2SXUIsCLrWZgJvB8,104
3
- cocoindex-0.1.43.dist-info/entry_points.txt,sha256=_NretjYVzBdNTn7dK-zgwr7YfG2afz1u1uSE-5bZXF8,46
4
- cocoindex-0.1.43.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
5
- cocoindex/__init__.py,sha256=ztuMoVHbGsyhgnN_CHBnY4yQtcsHi4O-u-Q3eUFaB5Y,816
6
- cocoindex/_engine.cpython-311-darwin.so,sha256=yTewruRgB6wQCP00OjCDNCILMVk0dEInGPHF3jhCrRg,56886416
7
- cocoindex/auth_registry.py,sha256=NsALZ3SKsDG9cPdrlTlalIqUvgbgFOaFGAbWJNedtJE,692
8
- cocoindex/cli.py,sha256=Gbn6vz37Gi5ckZYdRdJkcbNcokLbtDhH9wrZswISeRc,16554
9
- cocoindex/convert.py,sha256=75HSBie7DokM0RJyUBqeveZRl5y_Fl8lzByoRF0yb2M,6915
10
- cocoindex/flow.py,sha256=0otFFqO8XVv-uc1Qbya9BBCK1orv7CGI52TiB5v63xk,28409
11
- cocoindex/functions.py,sha256=F79dNmGE127LaU67kF5Oqtf_tIzebFQH7MkyceMX4-s,1830
12
- cocoindex/index.py,sha256=LssEOuZi6AqhwKtZM3QFeQpa9T-0ELi8G5DsrYKECvc,534
13
- cocoindex/lib.py,sha256=JiLIV5Fi-FNKMlH-6JMoe-UQsvirnFkkOLcoEQk9WkE,2903
14
- cocoindex/llm.py,sha256=_3rtahuKcqcEHPkFSwhXOSrekZyGxVApPoYtlU_chcA,348
15
- cocoindex/op.py,sha256=yyB3gYYj6uIeoGW9FXuj9Ludaz50QYDeqGgi3dKG1_I,10739
16
- cocoindex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- cocoindex/query.py,sha256=As-6xIEyr27dN8txF9CsCA9KeL6lyKR7bU6PW4RMBl0,3205
18
- cocoindex/runtime.py,sha256=jqRnWkkIlAhE04gi4y0Y5bzuq9FX4j0aVNU-nengLJk,980
19
- cocoindex/setting.py,sha256=5sywzYWnUNv80lNDwFlkFkUOoW0wo4n4DEuhFZxryxA,3265
20
- cocoindex/setup.py,sha256=ErNtX08NfFOFKehp5qGUvCx8Wiz9f3gmzvfBhAqrQyI,745
21
- cocoindex/sources.py,sha256=7lpwYLsFCRfbURKf79Vu0JZZoXjAYY0DxNHzUb-VHBY,1327
22
- cocoindex/storages.py,sha256=MFMsfyOCYMggTWeWrOi82miqOXQmiUuqq828x5htBr0,2207
23
- cocoindex/tests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
24
- cocoindex/tests/test_convert.py,sha256=7jc--I3frrg7DB5MPr4JFzE7DSCznJuWyHdlDLQJ_fM,15516
25
- cocoindex/typing.py,sha256=RMJXdey5_vd7JbPTEdUw1DeQ4Uu4MicdiaXjzQHFNRA,9031
26
- cocoindex/utils.py,sha256=eClhMdjBjcXaDkah-rPUmE7Y5Ncd7S1goUe2qTETR08,456
27
- cocoindex-0.1.43.dist-info/RECORD,,