cocoindex 0.1.33__cp313-cp313-macosx_11_0_arm64.whl → 0.1.34__cp313-cp313-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.
Binary file
cocoindex/cli.py CHANGED
@@ -55,16 +55,17 @@ def ls(show_all: bool):
55
55
 
56
56
  @cli.command()
57
57
  @click.argument("flow_name", type=str, required=False)
58
- @click.option("--color/--no-color", default=True)
59
- def show(flow_name: str | None, color: bool):
58
+ @click.option("--color/--no-color", default=True, help="Enable or disable colored output.")
59
+ @click.option("--verbose", is_flag=True, help="Show verbose output with full details.")
60
+ def show(flow_name: str | None, color: bool, verbose: bool):
60
61
  """
61
- Show the flow spec in a readable format with colored output,
62
- including the schema.
62
+ Show the flow spec and schema in a readable format with colored output.
63
63
  """
64
64
  flow = _flow_by_name(flow_name)
65
65
  console = Console(no_color=not color)
66
- console.print(flow._render_text())
66
+ console.print(flow._render_spec(verbose=verbose))
67
67
 
68
+ console.print()
68
69
  table = Table(
69
70
  title=f"Schema for Flow: {flow.name}",
70
71
  show_header=True,
@@ -74,7 +75,7 @@ def show(flow_name: str | None, color: bool):
74
75
  table.add_column("Type", style="green")
75
76
  table.add_column("Attributes", style="yellow")
76
77
 
77
- for field_name, field_type, attr_str in flow._render_schema():
78
+ for field_name, field_type, attr_str in flow._get_schema():
78
79
  table.add_row(field_name, field_type, attr_str)
79
80
 
80
81
  console.print(table)
@@ -85,15 +86,15 @@ def setup():
85
86
  Check and apply backend setup changes for flows, including the internal and target storage
86
87
  (to export).
87
88
  """
88
- status_check = sync_setup()
89
- click.echo(status_check)
90
- if status_check.is_up_to_date():
89
+ setup_status = sync_setup()
90
+ click.echo(setup_status)
91
+ if setup_status.is_up_to_date():
91
92
  click.echo("No changes need to be pushed.")
92
93
  return
93
94
  if not click.confirm(
94
95
  "Changes need to be pushed. Continue? [yes/N]", default=False, show_default=False):
95
96
  return
96
- apply_setup_changes(status_check)
97
+ apply_setup_changes(setup_status)
97
98
 
98
99
  @cli.command()
99
100
  @click.argument("flow_name", type=str, nargs=-1)
@@ -112,15 +113,15 @@ def drop(flow_name: tuple[str, ...], drop_all: bool):
112
113
  flow_names = [fl.name for fl in flow.flows()]
113
114
  else:
114
115
  flow_names = list(flow_name)
115
- status_check = drop_setup(flow_names)
116
- click.echo(status_check)
117
- if status_check.is_up_to_date():
116
+ setup_status = drop_setup(flow_names)
117
+ click.echo(setup_status)
118
+ if setup_status.is_up_to_date():
118
119
  click.echo("No flows need to be dropped.")
119
120
  return
120
121
  if not click.confirm(
121
122
  "Changes need to be pushed. Continue? [yes/N]", default=False, show_default=False):
122
123
  return
123
- apply_setup_changes(status_check)
124
+ apply_setup_changes(setup_status)
124
125
 
125
126
  @cli.command()
126
127
  @click.argument("flow_name", type=str, required=False)
cocoindex/flow.py CHANGED
@@ -15,7 +15,7 @@ from threading import Lock
15
15
  from enum import Enum
16
16
  from dataclasses import dataclass
17
17
  from rich.text import Text
18
- from rich.console import Console
18
+ from rich.tree import Tree
19
19
 
20
20
  from . import _engine
21
21
  from . import index
@@ -161,6 +161,9 @@ class DataSlice:
161
161
  """
162
162
  Apply a function to the data slice.
163
163
  """
164
+ if not isinstance(fn_spec, op.FunctionSpec):
165
+ raise ValueError("transform() can only be called on a CocoIndex function")
166
+
164
167
  transform_args: list[tuple[Any, str | None]]
165
168
  transform_args = [(self._state.engine_data_slice, None)]
166
169
  transform_args += [(self._state.flow_builder_state.get_data_slice(v), None) for v in args]
@@ -280,6 +283,9 @@ class DataCollector:
280
283
 
281
284
  `vector_index` is for backward compatibility only. Please use `vector_indexes` instead.
282
285
  """
286
+ if not isinstance(target_spec, op.StorageSpec):
287
+ raise ValueError("export() can only be called on a CocoIndex target storage")
288
+
283
289
  # For backward compatibility only.
284
290
  if len(vector_indexes) == 0 and len(vector_index) > 0:
285
291
  vector_indexes = [index.VectorIndexDef(field_name=field_name, metric=metric)
@@ -343,8 +349,10 @@ class FlowBuilder:
343
349
  refresh_interval: datetime.timedelta | None = None,
344
350
  ) -> DataSlice:
345
351
  """
346
- Add a source to the flow.
352
+ Import a source to the flow.
347
353
  """
354
+ if not isinstance(spec, op.SourceSpec):
355
+ raise ValueError("add_source() can only be called on a CocoIndex source")
348
356
  return _create_data_slice(
349
357
  self._state,
350
358
  lambda target_scope, name: self._state.engine_flow_builder.add_source(
@@ -454,61 +462,33 @@ class Flow:
454
462
  return engine_flow
455
463
  self._lazy_engine_flow = _lazy_engine_flow
456
464
 
457
- def _format_flow(self, flow_dict: dict) -> Text:
458
- output = Text()
465
+ def _render_spec(self, verbose: bool = False) -> Tree:
466
+ """
467
+ Render the flow spec as a styled rich Tree with hierarchical structure.
468
+ """
469
+ spec = self._get_spec(verbose=verbose)
470
+ tree = Tree(f"Flow: {self.name}", style="cyan")
459
471
 
460
- def add_line(content, indent=0, style=None, end="\n"):
461
- output.append(" " * indent)
462
- output.append(content, style=style)
463
- output.append(end)
472
+ def build_tree(label: str, lines: list):
473
+ node = Tree(label, style="bold magenta" if lines else "cyan")
474
+ for line in lines:
475
+ child_node = node.add(Text(line.content, style="yellow"))
476
+ child_node.children = build_tree("", line.children).children
477
+ return node
464
478
 
465
- def format_key_value(key, value, indent):
466
- if isinstance(value, (dict, list)):
467
- add_line(f"- {key}:", indent, style="green")
468
- format_data(value, indent + 2)
469
- else:
470
- add_line(f"- {key}:", indent, style="green", end="")
471
- add_line(f" {value}", style="yellow")
472
-
473
- def format_data(data, indent=0):
474
- if isinstance(data, dict):
475
- for key, value in data.items():
476
- format_key_value(key, value, indent)
477
- elif isinstance(data, list):
478
- for i, item in enumerate(data):
479
- format_key_value(f"[{i}]", item, indent)
480
- else:
481
- add_line(str(data), indent, style="yellow")
482
-
483
- # Header
484
- flow_name = flow_dict.get("name", "Unnamed")
485
- add_line(f"Flow: {flow_name}", style="bold cyan")
486
-
487
- # Section
488
- for section_title, section_key in [
489
- ("Sources:", "import_ops"),
490
- ("Processing:", "reactive_ops"),
491
- ("Targets:", "export_ops"),
492
- ]:
493
- add_line("")
494
- add_line(section_title, style="bold cyan")
495
- format_data(flow_dict.get(section_key, []), indent=0)
496
-
497
- return output
498
-
499
- def _render_text(self) -> Text:
500
- flow_spec_str = str(self._lazy_engine_flow())
501
- try:
502
- flow_dict = json.loads(flow_spec_str)
503
- return self._format_flow(flow_dict)
504
- except json.JSONDecodeError:
505
- return Text(flow_spec_str)
479
+ for section, lines in spec.sections:
480
+ section_node = build_tree(f"{section}:", lines)
481
+ tree.children.append(section_node)
482
+ return tree
483
+
484
+ def _get_spec(self, verbose: bool = False) -> list[tuple[str, str, int]]:
485
+ return self._lazy_engine_flow().get_spec(output_mode="verbose" if verbose else "concise")
506
486
 
507
- def _render_schema(self) -> list[tuple[str, str, str]]:
487
+ def _get_schema(self) -> list[tuple[str, str, str]]:
508
488
  return self._lazy_engine_flow().get_schema()
509
489
 
510
490
  def __str__(self):
511
- return str(self._render_text())
491
+ return str(self._get_spec())
512
492
 
513
493
  def __repr__(self):
514
494
  return repr(self._lazy_engine_flow())
cocoindex/setup.py CHANGED
@@ -1,16 +1,16 @@
1
1
  from . import flow
2
2
  from . import _engine
3
3
 
4
- def sync_setup() -> _engine.SetupStatusCheck:
4
+ def sync_setup() -> _engine.SetupStatus:
5
5
  flow.ensure_all_flows_built()
6
6
  return _engine.sync_setup()
7
7
 
8
- def drop_setup(flow_names: list[str]) -> _engine.SetupStatusCheck:
8
+ def drop_setup(flow_names: list[str]) -> _engine.SetupStatus:
9
9
  flow.ensure_all_flows_built()
10
10
  return _engine.drop_setup(flow_names)
11
11
 
12
12
  def flow_names_with_setup() -> list[str]:
13
13
  return _engine.flow_names_with_setup()
14
14
 
15
- def apply_setup_changes(status_check: _engine.SetupStatusCheck):
16
- _engine.apply_setup_changes(status_check)
15
+ def apply_setup_changes(setup_status: _engine.SetupStatus):
16
+ _engine.apply_setup_changes(setup_status)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cocoindex
3
- Version: 0.1.33
3
+ Version: 0.1.34
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
@@ -28,44 +28,74 @@ Project-URL: Homepage, https://cocoindex.io/
28
28
  [![PyPI version](https://img.shields.io/pypi/v/cocoindex?color=5B5BD6)](https://pypi.org/project/cocoindex/)
29
29
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/cocoindex)](https://pypistats.org/packages/cocoindex)
30
30
 
31
- <!-- [![Python](https://img.shields.io/badge/python-3.11%20to%203.13-5B5BD6?logo=python&logoColor=white)](https://www.python.org/) -->
32
31
  [![CI](https://github.com/cocoindex-io/cocoindex/actions/workflows/CI.yml/badge.svg?event=push&color=5B5BD6)](https://github.com/cocoindex-io/cocoindex/actions/workflows/CI.yml)
33
32
  [![release](https://github.com/cocoindex-io/cocoindex/actions/workflows/release.yml/badge.svg?event=push&color=5B5BD6)](https://github.com/cocoindex-io/cocoindex/actions/workflows/release.yml)
34
33
  [![Discord](https://img.shields.io/discord/1314801574169673738?logo=discord&color=5B5BD6&logoColor=white)](https://discord.com/invite/zpA9S2DR7s)
35
- <!--[![LinkedIn](https://img.shields.io/badge/LinkedIn-CocoIndex-5B5BD6?logo=linkedin&logoColor=white)](https://www.linkedin.com/company/cocoindex) -->
36
- <!--[![X (Twitter)](https://img.shields.io/twitter/follow/cocoindex_io)](https://twitter.com/intent/follow?screen_name=cocoindex_io) -->
37
-
38
34
  </div>
39
35
 
40
- CocoIndex is the world's first open-source engine that supports both custom transformation logic and incremental updates specialized for data indexing.
36
+ **CocoIndex** is an ultra performant data transformation framework, with its core engine written in Rust. The problem it tries to solve is to make it easy to prepare fresh data for AI - either creating embedding, building knowledge graphs, or performing other data transformations - and take real-time data pipelines beyond traditional SQL.
37
+
38
+ <p align="center">
39
+ <img src="https://cocoindex.io/images/cocoindex-features.png" alt="CocoIndex Features" width="500">
40
+ </p>
41
+
42
+ The philosophy is to have the framework handle the source updates, and having developers only worry about defining a series of data transformation, inspired by spreadsheet.
43
+
44
+ ## Dataflow programming
45
+ Unlike a workflow orchestration framework where data is usually opaque, in CocoIndex, data and data operations are first class citizens. CocoIndex follows the idea of [Dataflow](https://en.wikipedia.org/wiki/Dataflow_programming) programming model. Each transformation creates a new field solely based on input fields, without hidden states and value mutation. All data before/after each transformation is observable, with lineage out of the box.
46
+
47
+ **Particularly**, users don't explicitly mutate data by creating, updating and deleting. Rather, they define something like - for a set of source data, this is the transformation or formula. The framework takes care of the data operations such as when to create, update, or delete.
48
+
49
+ ```python
50
+ # import
51
+ data['content'] = flow_builder.add_source(...)
52
+
53
+ # transform
54
+ data['out'] = data['content']
55
+ .transform(...)
56
+ .transform(...)
57
+
58
+ # collect data
59
+ collector.collect(...)
60
+
61
+ # export to db, vector db, graph db ...
62
+ collector.export(...)
63
+ ```
64
+
65
+ ## Data Freshness
66
+ As a data framework, CocoIndex takes it to the next level on data freshness. **Incremental processing** is one of the core values provided by CocoIndex.
67
+
41
68
  <p align="center">
42
- <img src="https://cocoindex.io/images/venn.svg" alt="CocoIndex">
69
+ <img src="https://github.com/user-attachments/assets/f4eb29b3-84ee-4fa0-a1e2-80eedeeabde6" alt="Incremental Processing" width="700">
43
70
  </p>
44
- 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.
71
+
72
+ The frameworks takes care of
73
+ - Change data capture.
74
+ - Figure out what exactly needs to be updated, and only updating that without having to recompute everything.
75
+
76
+ This makes it fast to reflect any source updates to the target store. If you have concerns with surfacing stale data to AI agents and are spending lots of efforts working on infra piece to optimize the latency, the framework actually handles it for you.
45
77
 
46
78
 
47
79
  ## Quick Start:
48
- If you're new to CocoIndex 🤗, we recommend checking out the 📖 [Documentation](https://cocoindex.io/docs) and ⚡ [Quick Start Guide](https://cocoindex.io/docs/getting_started/quickstart). We also have a ▶️ [quick start video tutorial](https://youtu.be/gv5R8nOXsWU?si=9ioeKYkMEnYevTXT) for you to jump start.
80
+ If you're new to CocoIndex, we recommend checking out
81
+ - 📖 [Documentation](https://cocoindex.io/docs)
82
+ - ⚡ [Quick Start Guide](https://cocoindex.io/docs/getting_started/quickstart)
83
+ - 🎬 [Quick Start Video Tutorial](https://youtu.be/gv5R8nOXsWU?si=9ioeKYkMEnYevTXT)
49
84
 
50
85
  ### Setup
86
+
51
87
  1. Install CocoIndex Python library
52
88
 
53
89
  ```bash
54
90
  pip install -U cocoindex
55
91
  ```
56
92
 
57
- 2. Setup Postgres with pgvector extension; or bring up a Postgres database using docker compose:
93
+ 2. [Install Postgres](https://cocoindex.io/docs/getting_started/installation#-install-postgres) if you don't have one. CocoIndex uses it for incremental processing.
58
94
 
59
- - Make sure Docker Compose is installed: [docs](https://docs.docker.com/compose/install/)
60
- - Start a Postgres SQL database for cocoindex using our docker compose config:
61
95
 
62
- ```bash
63
- docker compose -f <(curl -L https://raw.githubusercontent.com/cocoindex-io/cocoindex/refs/heads/main/dev/postgres.yaml) up -d
64
- ```
96
+ ### Define data flow
65
97
 
66
- ### Start your first indexing flow!
67
- Follow [Quick Start Guide](https://cocoindex.io/docs/getting_started/quickstart) to define your first indexing flow.
68
- A common indexing flow looks like:
98
+ Follow [Quick Start Guide](https://cocoindex.io/docs/getting_started/quickstart) to define your first indexing flow. An example flow looks like:
69
99
 
70
100
  ```python
71
101
  @cocoindex.flow_def(name="TextEmbedding")
@@ -106,10 +136,11 @@ def text_embedding_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoind
106
136
  ```
107
137
 
108
138
  It defines an index flow like this:
109
- ![Flow diagram](docs/docs/core/flow_example.svg)
110
139
 
111
- ### Play with existing example and demo
112
- Go to the [examples directory](examples) to try out with any of the examples, following instructions under specific example directory.
140
+ <img width="363" alt="Data Flow" src="https://github.com/user-attachments/assets/2ea7be6d-3d94-42b1-b2bd-22515577e463" />
141
+
142
+
143
+ ## 🚀 Examples and demo
113
144
 
114
145
  | Example | Description |
115
146
  |---------|-------------|
@@ -121,8 +152,10 @@ Go to the [examples directory](examples) to try out with any of the examples, fo
121
152
  | [Docs to Knowledge Graph](examples/docs_to_knowledge_graph) | Extract relationships from Markdown documents and build a knowledge graph |
122
153
  | [Embeddings to Qdrant](examples/text_embedding_qdrant) | Index documents in a Qdrant collection for semantic search |
123
154
  | [FastAPI Server with Docker](examples/fastapi_server_docker) | Run the semantic search server in a Dockerized FastAPI setup |
155
+ | [Product_Taxonomy_Knowledge_Graph](examples/product_taxonomy_knowledge_graph) | Build knowledge graph for product recommendations |
156
+ | [Image Search with Vision API](examples/image_search_example) | Generates detailed captions for images using a vision model, embeds them, enables semantic search via FastAPI and served on a React frontend.|
124
157
 
125
- More coming and stay tuned! If there's any specific examples you would like to see, please let us know in our [Discord community](https://discord.com/invite/zpA9S2DR7s) 🌱.
158
+ More coming and stay tuned 👀!
126
159
 
127
160
  ## 📖 Documentation
128
161
  For detailed documentation, visit [CocoIndex Documentation](https://cocoindex.io/docs), including a [Quickstart guide](https://cocoindex.io/docs/getting_started/quickstart).
@@ -136,13 +169,13 @@ Welcome with a huge coconut hug 🥥⋆。˚🤗. We are super excited for commu
136
169
  Join our community here:
137
170
 
138
171
  - 🌟 [Star us on GitHub](https://github.com/cocoindex-io/cocoindex)
139
- - 💬 [Start a GitHub Discussion](https://github.com/cocoindex-io/cocoindex/discussions)
140
172
  - 👋 [Join our Discord community](https://discord.com/invite/zpA9S2DR7s)
141
- - 𝕏 [Follow us on X](https://x.com/cocoindex_io)
142
- - 🐚 [Follow us on LinkedIn](https://www.linkedin.com/company/cocoindex/about/)
143
173
  - ▶️ [Subscribe to our YouTube channel](https://www.youtube.com/@cocoindex-io)
144
174
  - 📜 [Read our blog posts](https://cocoindex.io/blogs/)
145
175
 
176
+ ## Support us:
177
+ We are constantly improving, and more features and examples are coming soon. If you love this project, please drop us a star ⭐ at GitHub repo [![GitHub](https://img.shields.io/github/stars/cocoindex-io/cocoindex?color=5B5BD6)](https://github.com/cocoindex-io/cocoindex) to stay tuned and help us grow.
178
+
146
179
  ## License
147
180
  CocoIndex is Apache 2.0 licensed.
148
181
 
@@ -1,25 +1,25 @@
1
- cocoindex-0.1.33.dist-info/METADATA,sha256=SNak6BWyWii_I2_xCTt5KPvqobfaGtBJuywUfhBFMuo,8236
2
- cocoindex-0.1.33.dist-info/WHEEL,sha256=_czbP61TsBkf9T201RekHMHlqESnWn7yJwXBJC9P-w0,104
3
- cocoindex-0.1.33.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1
+ cocoindex-0.1.34.dist-info/METADATA,sha256=kSB_ocT5BakKnBmCeN1LBCTywDZ9w2d1gEfq-XZvH4c,9686
2
+ cocoindex-0.1.34.dist-info/WHEEL,sha256=E1n5fBV87GjwiE9CayevgONfw5z1JsKZqIr2VxzumWg,104
3
+ cocoindex-0.1.34.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
4
+ cocoindex/__init__.py,sha256=CMfiZ-CROvrcE6jjkmzEZBk4HjuN6s6nfRXtSd0c_z8,684
5
+ cocoindex/_engine.cpython-313-darwin.so,sha256=3X91YMXEpjyxY5C1JxGGo6_zzkCOynIyYplJ98td1P0,49713808
6
+ cocoindex/auth_registry.py,sha256=NsALZ3SKsDG9cPdrlTlalIqUvgbgFOaFGAbWJNedtJE,692
7
+ cocoindex/cli.py,sha256=nJoSmQ44DxF0rAccwjCtLwu0AwhhIA1MtsfWQ2AORz8,9047
8
+ cocoindex/convert.py,sha256=mBUTa_Ag39_ut-yE_jc1wqS3zLjtOm6QKet-bqJ-RWc,5947
9
+ cocoindex/flow.py,sha256=baVNPwvJ1aWZlAgJmv1qnERLaBpejuooIdHxDteVM1c,22599
4
10
  cocoindex/functions.py,sha256=F79dNmGE127LaU67kF5Oqtf_tIzebFQH7MkyceMX4-s,1830
5
- cocoindex/query.py,sha256=8_3Lb_EVjZtl2ZyJNZGX16LoKXEd-PL8OjY-zs9GQeA,3205
6
11
  cocoindex/index.py,sha256=LssEOuZi6AqhwKtZM3QFeQpa9T-0ELi8G5DsrYKECvc,534
7
12
  cocoindex/lib.py,sha256=812GB8Z-2PyjG73Odvw5jtNBLnoeU9aOh9s2ZnETKa8,2329
8
- cocoindex/auth_registry.py,sha256=NsALZ3SKsDG9cPdrlTlalIqUvgbgFOaFGAbWJNedtJE,692
9
- cocoindex/convert.py,sha256=mBUTa_Ag39_ut-yE_jc1wqS3zLjtOm6QKet-bqJ-RWc,5947
10
- cocoindex/tests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
11
- cocoindex/tests/test_convert.py,sha256=WPRKp0jv_uSEM81RGWEAmsax-J-FtXt90mZ0yEnvGLs,11236
12
- cocoindex/__init__.py,sha256=CMfiZ-CROvrcE6jjkmzEZBk4HjuN6s6nfRXtSd0c_z8,684
13
- cocoindex/flow.py,sha256=KVbB_Ebm0IpJgZxV4BLg30fjIPmsGFhrtmQOBqCZaIk,23037
14
13
  cocoindex/llm.py,sha256=_3rtahuKcqcEHPkFSwhXOSrekZyGxVApPoYtlU_chcA,348
15
- cocoindex/setting.py,sha256=pms1blwlXIOqZIpye-rfiwzqYUCAC8oEL7mQM5A160g,2356
16
- cocoindex/runtime.py,sha256=jqRnWkkIlAhE04gi4y0Y5bzuq9FX4j0aVNU-nengLJk,980
17
14
  cocoindex/op.py,sha256=OGYRYl7gPa7X7iSU30iTrCzvqRBu7jQqfvN4vjG__dA,10730
18
- cocoindex/sources.py,sha256=wZFU8lwSXjyofJR-syySH9fTyPnBlAPJ6-1hQNX8fGA,936
19
- cocoindex/setup.py,sha256=W1HshwYk_K2aeLOVn_e62ZOXBO9yWsoUboRiH4SjF48,496
20
- cocoindex/cli.py,sha256=Vh8bNZ41yLr1l_jJR1Z_b7mY-dOvN-EbiCRxDvtIsRk,8885
21
15
  cocoindex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- cocoindex/typing.py,sha256=BI2vPw4Iu4S3aznNJQrfM2LZU_weGYASTXF1W3ZWh_Y,8568
16
+ cocoindex/query.py,sha256=8_3Lb_EVjZtl2ZyJNZGX16LoKXEd-PL8OjY-zs9GQeA,3205
17
+ cocoindex/runtime.py,sha256=jqRnWkkIlAhE04gi4y0Y5bzuq9FX4j0aVNU-nengLJk,980
18
+ cocoindex/setting.py,sha256=pms1blwlXIOqZIpye-rfiwzqYUCAC8oEL7mQM5A160g,2356
19
+ cocoindex/setup.py,sha256=AQLbtBLuJX066IANS7BGp20246mAGQ_4Z0W6MVJcQzY,481
20
+ cocoindex/sources.py,sha256=wZFU8lwSXjyofJR-syySH9fTyPnBlAPJ6-1hQNX8fGA,936
23
21
  cocoindex/storages.py,sha256=MFMsfyOCYMggTWeWrOi82miqOXQmiUuqq828x5htBr0,2207
24
- cocoindex/_engine.cpython-313-darwin.so,sha256=1Zi8FznUsI6jQSwOd4kpEl4FkER6T0Zw4ern2jGR4es,49631504
25
- cocoindex-0.1.33.dist-info/RECORD,,
22
+ cocoindex/tests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
23
+ cocoindex/tests/test_convert.py,sha256=WPRKp0jv_uSEM81RGWEAmsax-J-FtXt90mZ0yEnvGLs,11236
24
+ cocoindex/typing.py,sha256=BI2vPw4Iu4S3aznNJQrfM2LZU_weGYASTXF1W3ZWh_Y,8568
25
+ cocoindex-0.1.34.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: maturin (1.8.3)
2
+ Generator: maturin (1.8.4)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp313-cp313-macosx_11_0_arm64