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.
- cocoindex/_engine.cpython-313-darwin.so +0 -0
- cocoindex/cli.py +15 -14
- cocoindex/flow.py +31 -51
- cocoindex/setup.py +4 -4
- {cocoindex-0.1.33.dist-info → cocoindex-0.1.34.dist-info}/METADATA +58 -25
- {cocoindex-0.1.33.dist-info → cocoindex-0.1.34.dist-info}/RECORD +18 -18
- {cocoindex-0.1.33.dist-info → cocoindex-0.1.34.dist-info}/WHEEL +1 -1
- {cocoindex-0.1.33.dist-info → cocoindex-0.1.34.dist-info}/licenses/LICENSE +0 -0
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
|
-
|
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.
|
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.
|
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
|
-
|
89
|
-
click.echo(
|
90
|
-
if
|
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(
|
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
|
-
|
116
|
-
click.echo(
|
117
|
-
if
|
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(
|
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.
|
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
|
-
|
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
|
458
|
-
|
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
|
461
|
-
|
462
|
-
|
463
|
-
|
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
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
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
|
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.
|
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.
|
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.
|
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(
|
16
|
-
_engine.apply_setup_changes(
|
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.
|
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
|
[](https://pypi.org/project/cocoindex/)
|
29
29
|
[](https://pypistats.org/packages/cocoindex)
|
30
30
|
|
31
|
-
<!-- [](https://www.python.org/) -->
|
32
31
|
[](https://github.com/cocoindex-io/cocoindex/actions/workflows/CI.yml)
|
33
32
|
[](https://github.com/cocoindex-io/cocoindex/actions/workflows/release.yml)
|
34
33
|
[](https://discord.com/invite/zpA9S2DR7s)
|
35
|
-
<!--[](https://www.linkedin.com/company/cocoindex) -->
|
36
|
-
<!--[](https://twitter.com/intent/follow?screen_name=cocoindex_io) -->
|
37
|
-
|
38
34
|
</div>
|
39
35
|
|
40
|
-
CocoIndex is
|
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://
|
69
|
+
<img src="https://github.com/user-attachments/assets/f4eb29b3-84ee-4fa0-a1e2-80eedeeabde6" alt="Incremental Processing" width="700">
|
43
70
|
</p>
|
44
|
-
|
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
|
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.
|
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
|
-
|
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
|
-
|
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
|
-

|
110
139
|
|
111
|
-
|
112
|
-
|
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
|
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 [](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.
|
2
|
-
cocoindex-0.1.
|
3
|
-
cocoindex-0.1.
|
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/
|
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/
|
25
|
-
cocoindex
|
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,,
|
File without changes
|