cocoindex 0.2.9__cp311-abi3-macosx_10_12_x86_64.whl → 0.2.11__cp311-abi3-macosx_10_12_x86_64.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/__init__.py CHANGED
@@ -6,7 +6,12 @@ from . import functions, sources, targets, cli, utils
6
6
 
7
7
  from . import targets as storages # Deprecated: Use targets instead
8
8
 
9
- from .auth_registry import AuthEntryReference, add_auth_entry, add_transient_auth_entry
9
+ from .auth_registry import (
10
+ AuthEntryReference,
11
+ add_auth_entry,
12
+ add_transient_auth_entry,
13
+ ref_auth_entry,
14
+ )
10
15
  from .flow import FlowBuilder, DataScope, DataSlice, Flow, transform_flow
11
16
  from .flow import flow_def
12
17
  from .flow import EvaluateAndDumpOptions, GeneratedField
@@ -14,11 +19,12 @@ from .flow import FlowLiveUpdater, FlowLiveUpdaterOptions, FlowUpdaterStatusUpda
14
19
  from .flow import open_flow
15
20
  from .flow import add_flow_def, remove_flow # DEPRECATED
16
21
  from .flow import update_all_flows_async, setup_all_flows, drop_all_flows
17
- from .lib import init, start_server, stop
22
+ from .lib import settings, init, start_server, stop
18
23
  from .llm import LlmSpec, LlmApiType
19
24
  from .index import VectorSimilarityMetric, VectorIndexDef, IndexOptions
20
25
  from .setting import DatabaseConnectionSpec, Settings, ServerSettings
21
26
  from .setting import get_app_namespace
27
+ from .query_handler import QueryHandlerResultFields, QueryInfo, QueryOutput
22
28
  from .typing import (
23
29
  Int64,
24
30
  Float32,
@@ -65,6 +71,7 @@ __all__ = [
65
71
  "setup_all_flows",
66
72
  "drop_all_flows",
67
73
  # Lib
74
+ "settings",
68
75
  "init",
69
76
  "start_server",
70
77
  "stop",
@@ -89,4 +96,8 @@ __all__ = [
89
96
  "Range",
90
97
  "Vector",
91
98
  "Json",
99
+ # Query handler
100
+ "QueryHandlerResultFields",
101
+ "QueryInfo",
102
+ "QueryOutput",
92
103
  ]
cocoindex/_engine.abi3.so CHANGED
Binary file
@@ -11,18 +11,6 @@ from .convert import dump_engine_object
11
11
 
12
12
  T = TypeVar("T")
13
13
 
14
- # Global atomic counter for generating unique auth entry keys
15
- _counter_lock = threading.Lock()
16
- _auth_key_counter = 0
17
-
18
-
19
- def _generate_auth_key() -> str:
20
- """Generate a unique auth entry key using a global atomic counter."""
21
- global _auth_key_counter # pylint: disable=global-statement
22
- with _counter_lock:
23
- _auth_key_counter += 1
24
- return f"__auth_{_auth_key_counter}"
25
-
26
14
 
27
15
  @dataclass
28
16
  class TransientAuthEntryReference(Generic[T]):
@@ -37,7 +25,8 @@ class AuthEntryReference(TransientAuthEntryReference[T]):
37
25
 
38
26
  def add_transient_auth_entry(value: T) -> TransientAuthEntryReference[T]:
39
27
  """Add an auth entry to the registry. Returns its reference."""
40
- return add_auth_entry(_generate_auth_key(), value)
28
+ key = _engine.add_transient_auth_entry(dump_engine_object(value))
29
+ return TransientAuthEntryReference(key)
41
30
 
42
31
 
43
32
  def add_auth_entry(key: str, value: T) -> AuthEntryReference[T]:
cocoindex/cli.py CHANGED
@@ -91,8 +91,6 @@ def _load_user_app(app_target: str) -> None:
91
91
 
92
92
 
93
93
  def _initialize_cocoindex_in_process() -> None:
94
- settings = setting.Settings.from_env()
95
- lib.init(settings)
96
94
  atexit.register(lib.stop)
97
95
 
98
96
 
cocoindex/convert.py CHANGED
@@ -616,6 +616,8 @@ def dump_engine_object(v: Any) -> Any:
616
616
  return s
617
617
  elif isinstance(v, (list, tuple)):
618
618
  return [dump_engine_object(item) for item in v]
619
+ elif isinstance(v, np.ndarray):
620
+ return v.tolist()
619
621
  elif isinstance(v, dict):
620
622
  return {k: dump_engine_object(v) for k, v in v.items()}
621
623
  return v
cocoindex/flow.py CHANGED
@@ -38,9 +38,10 @@ from .convert import (
38
38
  make_engine_value_encoder,
39
39
  )
40
40
  from .op import FunctionSpec
41
- from .runtime import execution_context
41
+ from .runtime import execution_context, to_async_call
42
42
  from .setup import SetupChangeBundle
43
43
  from .typing import analyze_type_info, encode_enriched_type
44
+ from .query_handler import QueryHandlerInfo, QueryHandlerResultFields
44
45
  from .validation import (
45
46
  validate_flow_name,
46
47
  validate_full_flow_name,
@@ -694,28 +695,18 @@ class Flow:
694
695
  """
695
696
 
696
697
  _name: str
697
- _full_name: str
698
- _lazy_engine_flow: Callable[[], _engine.Flow] | None
698
+ _engine_flow_creator: Callable[[], _engine.Flow]
699
699
 
700
- def __init__(
701
- self, name: str, full_name: str, engine_flow_creator: Callable[[], _engine.Flow]
702
- ):
700
+ _lazy_flow_lock: Lock
701
+ _lazy_query_handler_args: list[tuple[Any, ...]]
702
+ _lazy_engine_flow: _engine.Flow | None = None
703
+
704
+ def __init__(self, name: str, engine_flow_creator: Callable[[], _engine.Flow]):
703
705
  validate_flow_name(name)
704
- validate_full_flow_name(full_name)
705
706
  self._name = name
706
- self._full_name = full_name
707
- engine_flow = None
708
- lock = Lock()
709
-
710
- def _lazy_engine_flow() -> _engine.Flow:
711
- nonlocal engine_flow, lock
712
- if engine_flow is None:
713
- with lock:
714
- if engine_flow is None:
715
- engine_flow = engine_flow_creator()
716
- return engine_flow
717
-
718
- self._lazy_engine_flow = _lazy_engine_flow
707
+ self._engine_flow_creator = engine_flow_creator
708
+ self._lazy_flow_lock = Lock()
709
+ self._lazy_query_handler_args = []
719
710
 
720
711
  def _render_spec(self, verbose: bool = False) -> Tree:
721
712
  """
@@ -762,7 +753,7 @@ class Flow:
762
753
  """
763
754
  Get the full name of the flow.
764
755
  """
765
- return self._full_name
756
+ return get_flow_full_name(self._name)
766
757
 
767
758
  def update(self, /, *, reexport_targets: bool = False) -> _engine.IndexUpdateInfo:
768
759
  """
@@ -799,15 +790,33 @@ class Flow:
799
790
  """
800
791
  Get the engine flow.
801
792
  """
802
- if self._lazy_engine_flow is None:
803
- raise RuntimeError(f"Flow {self.full_name} is already removed")
804
- return self._lazy_engine_flow()
793
+ if self._lazy_engine_flow is not None:
794
+ return self._lazy_engine_flow
795
+ return self._internal_flow()
805
796
 
806
797
  async def internal_flow_async(self) -> _engine.Flow:
807
798
  """
808
799
  Get the engine flow. The async version.
809
800
  """
810
- return await asyncio.to_thread(self.internal_flow)
801
+ if self._lazy_engine_flow is not None:
802
+ return self._lazy_engine_flow
803
+ return await asyncio.to_thread(self._internal_flow)
804
+
805
+ def _internal_flow(self) -> _engine.Flow:
806
+ """
807
+ Get the engine flow. The async version.
808
+ """
809
+ with self._lazy_flow_lock:
810
+ if self._lazy_engine_flow is not None:
811
+ return self._lazy_engine_flow
812
+
813
+ engine_flow = self._engine_flow_creator()
814
+ self._lazy_engine_flow = engine_flow
815
+ for args in self._lazy_query_handler_args:
816
+ engine_flow.add_query_handler(*args)
817
+ self._lazy_query_handler_args = []
818
+
819
+ return engine_flow
811
820
 
812
821
  def setup(self, report_to_stdout: bool = False) -> None:
813
822
  """
@@ -852,6 +861,53 @@ class Flow:
852
861
  with _flows_lock:
853
862
  del _flows[self.name]
854
863
 
864
+ def add_query_handler(
865
+ self,
866
+ name: str,
867
+ handler: Callable[[str], Any],
868
+ /,
869
+ *,
870
+ result_fields: QueryHandlerResultFields | None = None,
871
+ ) -> None:
872
+ """
873
+ Add a query handler to the flow.
874
+ """
875
+ async_handler = to_async_call(handler)
876
+
877
+ async def _handler(query: str) -> dict[str, Any]:
878
+ handler_result = await async_handler(query)
879
+ return {
880
+ "results": [
881
+ [(k, dump_engine_object(v)) for (k, v) in result.items()]
882
+ for result in handler_result.results
883
+ ],
884
+ "query_info": dump_engine_object(handler_result.query_info),
885
+ }
886
+
887
+ handler_info = dump_engine_object(QueryHandlerInfo(result_fields=result_fields))
888
+ with self._lazy_flow_lock:
889
+ if self._lazy_engine_flow is not None:
890
+ self._lazy_engine_flow.add_query_handler(name, _handler, handler_info)
891
+ else:
892
+ self._lazy_query_handler_args.append((name, _handler, handler_info))
893
+
894
+ def query_handler(
895
+ self,
896
+ name: str | None = None,
897
+ result_fields: QueryHandlerResultFields | None = None,
898
+ ) -> Callable[[Callable[[str], Any]], Callable[[str], Any]]:
899
+ """
900
+ A decorator to declare a query handler.
901
+ """
902
+
903
+ def _inner(handler: Callable[[str], Any]) -> Callable[[str], Any]:
904
+ self.add_query_handler(
905
+ name or handler.__qualname__, handler, result_fields=result_fields
906
+ )
907
+ return handler
908
+
909
+ return _inner
910
+
855
911
 
856
912
  def _create_lazy_flow(
857
913
  name: str | None, fl_def: Callable[[FlowBuilder, DataScope], None]
@@ -861,9 +917,10 @@ def _create_lazy_flow(
861
917
  The flow will be built the first time when it's really needed.
862
918
  """
863
919
  flow_name = _flow_name_builder.build_name(name, prefix="_flow_")
864
- flow_full_name = get_flow_full_name(flow_name)
865
920
 
866
921
  def _create_engine_flow() -> _engine.Flow:
922
+ flow_full_name = get_flow_full_name(flow_name)
923
+ validate_full_flow_name(flow_full_name)
867
924
  flow_builder_state = _FlowBuilderState(flow_full_name)
868
925
  root_scope = DataScope(
869
926
  flow_builder_state, flow_builder_state.engine_flow_builder.root_scope()
@@ -873,7 +930,7 @@ def _create_lazy_flow(
873
930
  execution_context.event_loop
874
931
  )
875
932
 
876
- return Flow(flow_name, flow_full_name, _create_engine_flow)
933
+ return Flow(flow_name, _create_engine_flow)
877
934
 
878
935
 
879
936
  _flows_lock = Lock()
cocoindex/lib.py CHANGED
@@ -2,12 +2,57 @@
2
2
  Library level functions and states.
3
3
  """
4
4
 
5
+ import threading
5
6
  import warnings
6
- from typing import Callable, Any
7
7
 
8
8
  from . import _engine # type: ignore
9
9
  from . import flow, setting
10
10
  from .convert import dump_engine_object
11
+ from .validation import validate_app_namespace_name
12
+ from typing import Any, Callable, overload
13
+
14
+
15
+ def prepare_settings(settings: setting.Settings) -> Any:
16
+ """Prepare the settings for the engine."""
17
+ if settings.app_namespace:
18
+ validate_app_namespace_name(settings.app_namespace)
19
+ return dump_engine_object(settings)
20
+
21
+
22
+ _engine.set_settings_fn(lambda: prepare_settings(setting.Settings.from_env()))
23
+
24
+
25
+ _prev_settings_fn: Callable[[], setting.Settings] | None = None
26
+ _prev_settings_fn_lock: threading.Lock = threading.Lock()
27
+
28
+
29
+ @overload
30
+ def settings(fn: Callable[[], setting.Settings]) -> Callable[[], setting.Settings]: ...
31
+ @overload
32
+ def settings(
33
+ fn: None,
34
+ ) -> Callable[[Callable[[], setting.Settings]], Callable[[], setting.Settings]]: ...
35
+ def settings(fn: Callable[[], setting.Settings] | None = None) -> Any:
36
+ """
37
+ Decorate a function that returns a settings.Settings object.
38
+ It registers the function as a settings provider.
39
+ """
40
+
41
+ def _inner(fn: Callable[[], setting.Settings]) -> Callable[[], setting.Settings]:
42
+ global _prev_settings_fn # pylint: disable=global-statement
43
+ with _prev_settings_fn_lock:
44
+ if _prev_settings_fn is not None:
45
+ warnings.warn(
46
+ f"Setting a new settings function will override the previous one {_prev_settings_fn}."
47
+ )
48
+ _prev_settings_fn = fn
49
+ _engine.set_settings_fn(lambda: prepare_settings(fn()))
50
+ return fn
51
+
52
+ if fn is not None:
53
+ return _inner(fn)
54
+ else:
55
+ return _inner
11
56
 
12
57
 
13
58
  def init(settings: setting.Settings | None = None) -> None:
@@ -16,9 +61,7 @@ def init(settings: setting.Settings | None = None) -> None:
16
61
 
17
62
  If the settings are not provided, they are loaded from the environment variables.
18
63
  """
19
- settings = settings or setting.Settings.from_env()
20
- _engine.init(dump_engine_object(settings))
21
- setting.set_app_namespace(settings.app_namespace)
64
+ _engine.init(prepare_settings(settings) if settings is not None else None)
22
65
 
23
66
 
24
67
  def start_server(settings: setting.ServerSettings) -> None:
cocoindex/op.py CHANGED
@@ -2,7 +2,6 @@
2
2
  Facilities for defining cocoindex operations.
3
3
  """
4
4
 
5
- import asyncio
6
5
  import dataclasses
7
6
  import inspect
8
7
  from enum import Enum
@@ -32,6 +31,7 @@ from .typing import (
32
31
  AnalyzedAnyType,
33
32
  AnalyzedDictType,
34
33
  )
34
+ from .runtime import to_async_call
35
35
 
36
36
 
37
37
  class OpCategory(Enum):
@@ -150,12 +150,6 @@ class OpArgs:
150
150
  arg_relationship: tuple[ArgRelationship, str] | None = None
151
151
 
152
152
 
153
- def _to_async_call(call: Callable[..., Any]) -> Callable[..., Awaitable[Any]]:
154
- if inspect.iscoroutinefunction(call):
155
- return call
156
- return lambda *args, **kwargs: asyncio.to_thread(lambda: call(*args, **kwargs))
157
-
158
-
159
153
  @dataclasses.dataclass
160
154
  class _ArgInfo:
161
155
  decoder: Callable[[Any], Any]
@@ -319,8 +313,8 @@ def _register_op_factory(
319
313
  """
320
314
  prepare_method = getattr(self._executor, "prepare", None)
321
315
  if prepare_method is not None:
322
- await _to_async_call(prepare_method)()
323
- self._acall = _to_async_call(self._executor.__call__)
316
+ await to_async_call(prepare_method)()
317
+ self._acall = to_async_call(self._executor.__call__)
324
318
 
325
319
  async def __call__(self, *args: Any, **kwargs: Any) -> Any:
326
320
  decoded_args = []
@@ -461,12 +455,12 @@ class _TargetConnector:
461
455
  self._get_persistent_key_fn = _get_required_method(
462
456
  connector_cls, "get_persistent_key"
463
457
  )
464
- self._apply_setup_change_async_fn = _to_async_call(
458
+ self._apply_setup_change_async_fn = to_async_call(
465
459
  _get_required_method(connector_cls, "apply_setup_change")
466
460
  )
467
461
 
468
462
  mutate_fn = _get_required_method(connector_cls, "mutate")
469
- self._mutate_async_fn = _to_async_call(mutate_fn)
463
+ self._mutate_async_fn = to_async_call(mutate_fn)
470
464
 
471
465
  # Store the type annotation for later use
472
466
  self._mutatation_type = self._analyze_mutate_mutation_type(
@@ -0,0 +1,51 @@
1
+ import dataclasses
2
+ import numpy as np
3
+ from numpy import typing as npt
4
+ from typing import Generic, TypeVar
5
+ from .index import VectorSimilarityMetric
6
+
7
+
8
+ @dataclasses.dataclass
9
+ class QueryHandlerResultFields:
10
+ """
11
+ Specify field names in query results returned by the query handler.
12
+ This provides metadata for tools like CocoInsight to recognize structure of the query results.
13
+ """
14
+
15
+ embedding: list[str] = dataclasses.field(default_factory=list)
16
+ score: str | None = None
17
+
18
+
19
+ @dataclasses.dataclass
20
+ class QueryHandlerInfo:
21
+ """
22
+ Info to configure a query handler.
23
+ """
24
+
25
+ result_fields: QueryHandlerResultFields | None = None
26
+
27
+
28
+ @dataclasses.dataclass
29
+ class QueryInfo:
30
+ """
31
+ Info about the query.
32
+ """
33
+
34
+ embedding: list[float] | npt.NDArray[np.float32] | None = None
35
+ similarity_metric: VectorSimilarityMetric | None = None
36
+
37
+
38
+ R = TypeVar("R")
39
+
40
+
41
+ @dataclasses.dataclass
42
+ class QueryOutput(Generic[R]):
43
+ """
44
+ Output of a query handler.
45
+
46
+ results: list of results. Each result can be a dict or a dataclass.
47
+ query_info: Info about the query.
48
+ """
49
+
50
+ results: list[R]
51
+ query_info: QueryInfo = dataclasses.field(default_factory=QueryInfo)
cocoindex/runtime.py CHANGED
@@ -5,7 +5,8 @@ manner.
5
5
 
6
6
  import threading
7
7
  import asyncio
8
- from typing import Any, Coroutine, TypeVar
8
+ import inspect
9
+ from typing import Any, Callable, Coroutine, TypeVar, Awaitable
9
10
 
10
11
 
11
12
  T = TypeVar("T")
@@ -35,3 +36,9 @@ class _ExecutionContext:
35
36
 
36
37
 
37
38
  execution_context = _ExecutionContext()
39
+
40
+
41
+ def to_async_call(call: Callable[..., Any]) -> Callable[..., Awaitable[Any]]:
42
+ if inspect.iscoroutinefunction(call):
43
+ return call
44
+ return lambda *args, **kwargs: asyncio.to_thread(lambda: call(*args, **kwargs))
cocoindex/setting.py CHANGED
@@ -6,16 +6,15 @@ import os
6
6
 
7
7
  from typing import Callable, Self, Any, overload
8
8
  from dataclasses import dataclass
9
- from .validation import validate_app_namespace_name
10
-
11
- _app_namespace: str = ""
9
+ from . import _engine # type: ignore
12
10
 
13
11
 
14
12
  def get_app_namespace(*, trailing_delimiter: str | None = None) -> str:
15
13
  """Get the application namespace. Append the `trailing_delimiter` if not empty."""
16
- if _app_namespace == "" or trailing_delimiter is None:
17
- return _app_namespace
18
- return f"{_app_namespace}{trailing_delimiter}"
14
+ app_namespace: str = _engine.get_app_namespace()
15
+ if app_namespace == "" or trailing_delimiter is None:
16
+ return app_namespace
17
+ return f"{app_namespace}{trailing_delimiter}"
19
18
 
20
19
 
21
20
  def split_app_namespace(full_name: str, delimiter: str) -> tuple[str, str]:
@@ -26,14 +25,6 @@ def split_app_namespace(full_name: str, delimiter: str) -> tuple[str, str]:
26
25
  return (parts[0], parts[1])
27
26
 
28
27
 
29
- def set_app_namespace(app_namespace: str) -> None:
30
- """Set the application namespace."""
31
- if app_namespace:
32
- validate_app_namespace_name(app_namespace)
33
- global _app_namespace # pylint: disable=global-statement
34
- _app_namespace = app_namespace
35
-
36
-
37
28
  @dataclass
38
29
  class DatabaseConnectionSpec:
39
30
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cocoindex
3
- Version: 0.2.9
3
+ Version: 0.2.11
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: License :: OSI Approved :: Apache Software License
6
6
  Classifier: Operating System :: OS Independent
@@ -1,21 +1,22 @@
1
- cocoindex-0.2.9.dist-info/METADATA,sha256=pAGAALnR660k-iGmmhH0NMTqmJx2eILu99lkLDXBerc,12998
2
- cocoindex-0.2.9.dist-info/WHEEL,sha256=N8W3-0eDM6igWj-H12r7VkxoMaJIqJLxUyWCFstEaGg,105
3
- cocoindex-0.2.9.dist-info/entry_points.txt,sha256=_NretjYVzBdNTn7dK-zgwr7YfG2afz1u1uSE-5bZXF8,46
4
- cocoindex-0.2.9.dist-info/licenses/THIRD_PARTY_NOTICES.html,sha256=F5Dm7y2cDyW5bZNG8a0bGXes0pVKHiaMrbcedg7chCk,716358
5
- cocoindex/__init__.py,sha256=sLpSVO5Cotgn_82lawxvXnaqfa-qj33rytWBAe2MTtU,2201
6
- cocoindex/_engine.abi3.so,sha256=RVxFkpK8U7yrI3YhtD8VnmRABOBkAdPvmpw8wmE1gPQ,69364420
7
- cocoindex/auth_registry.py,sha256=PE1-kVkcyC1G2C_V7b1kvYzeq73OFQehWKQP7ln7fJ8,1478
8
- cocoindex/cli.py,sha256=laLLHtEQvEt7Ua4xulsWEI_dH5IpHiaXyTWY8p1VF_c,21665
9
- cocoindex/convert.py,sha256=Eh9Co37BtW_PK3Oi-pFEiFt8cc_6g7XLcurV-NeH6GU,22090
10
- cocoindex/flow.py,sha256=wKT_RWeB9_sm764aNrOl2XU-RJIu4EK_sIkjcyZI8jA,37669
1
+ cocoindex-0.2.11.dist-info/METADATA,sha256=u-dE4rSfVStoZHzhM01B2D0N-8AqLGiV3NAYs1zs19U,12999
2
+ cocoindex-0.2.11.dist-info/WHEEL,sha256=N8W3-0eDM6igWj-H12r7VkxoMaJIqJLxUyWCFstEaGg,105
3
+ cocoindex-0.2.11.dist-info/entry_points.txt,sha256=_NretjYVzBdNTn7dK-zgwr7YfG2afz1u1uSE-5bZXF8,46
4
+ cocoindex-0.2.11.dist-info/licenses/THIRD_PARTY_NOTICES.html,sha256=o8g8gIN-zaK02_7ZMPlqompannwA2SwEB0e30CKRN1E,717804
5
+ cocoindex/__init__.py,sha256=AsoNLBgjJ-1AEKtwTnENJM9dEilHTq6rJ4qWUzGKSdc,2428
6
+ cocoindex/_engine.abi3.so,sha256=H-x9Yqz5RWpB0vkeGPpjb3QuOX1h8-ocQlqrPaXCnqw,70039588
7
+ cocoindex/auth_registry.py,sha256=9GgeuyE48vYhsJQJgI-uRjUviZkrQE63MUenP3OREko,1145
8
+ cocoindex/cli.py,sha256=69X30bFTFdM7c0_6lgIHR19CeQ7UEkobEQYihy8IdOQ,21599
9
+ cocoindex/convert.py,sha256=Apk5PU4XGnSvEE2HMRN2W9H4ApBIHnkupegv_-TaVfA,22152
10
+ cocoindex/flow.py,sha256=u_ta8wW5oGTDINs2dY4d_1hybySp3wuX79VJ4BDXZDc,39767
11
11
  cocoindex/functions.py,sha256=09erNt3WbzY9l1KER-akBF2O5-6xEahV2ORBECaL6yk,12260
12
12
  cocoindex/index.py,sha256=j93B9jEvvLXHtpzKWL88SY6wCGEoPgpsQhEGHlyYGFg,540
13
- cocoindex/lib.py,sha256=f--9dAYd84CZosbDZqNW0oGbBLsY3dXiUTR1VrfQ_QY,817
13
+ cocoindex/lib.py,sha256=0XheDF7fiFdqExpdqzU-VKun_Zll6DwZ5JfTm7u42aY,2284
14
14
  cocoindex/llm.py,sha256=Pv_cdnRngTLtuLU9AUmS8izIHhcKVnuBNolC33f9BDI,851
15
- cocoindex/op.py,sha256=3jTEpmzHPjg-euZhXjQqgF0i8V2LHUdkq7bp4AAIHRM,21627
15
+ cocoindex/op.py,sha256=SRtI5ApgRQJHNsljd9Z2qNdS68_pYYQj9oVg3Bqc8W4,21416
16
16
  cocoindex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- cocoindex/runtime.py,sha256=povilB3HH3y1JF-yxKwU-pD8n2WnAqyQxIgvXXHNc60,1080
18
- cocoindex/setting.py,sha256=rynB2qriPXysEDXp1YV_riqfyiGInR62tcWeDu8MMko,5214
17
+ cocoindex/query_handler.py,sha256=o9XFnpXWa00pAFImJ9oq-_kjI7w69dgCalkq63H9mA8,1192
18
+ cocoindex/runtime.py,sha256=4NxcltaDZvA3RR3Pnt6gH_f99jcWSyMH_1Xi5BjbtwY,1342
19
+ cocoindex/setting.py,sha256=1Dx8ktjwf-8BiXrbsmfn5Mzudb2SQYqFdRnSNGVKaLk,4960
19
20
  cocoindex/setup.py,sha256=7uIHKN4FOCuoidPXcKyGTrkqpkl9luL49-6UcnMxYzw,3068
20
21
  cocoindex/sources.py,sha256=FYz7cWYasLGDaYoIEQ1dF2uprgUETHWsTIrIS7n6pQE,3188
21
22
  cocoindex/subprocess_exec.py,sha256=r1xO84uek4VP4I6i87JMwsH5xFm3vKW0ABvgn0jskt4,10088
@@ -30,4 +31,4 @@ cocoindex/typing.py,sha256=lEQYIzAGVKQp6RnhyeopY9Q7xEED7yQj3ZMxvTPblV8,14200
30
31
  cocoindex/user_app_loader.py,sha256=bc3Af-gYRxJ9GpObtpjegZY855oQBCv5FGkrkWV2yGY,1873
31
32
  cocoindex/utils.py,sha256=hUhX-XV6XGCtJSEIpBOuDv6VvqImwPlgBxztBTw7u0U,598
32
33
  cocoindex/validation.py,sha256=PZnJoby4sLbsmPv9fOjOQXuefjfZ7gmtsiTGU8SH-tc,3090
33
- cocoindex-0.2.9.dist-info/RECORD,,
34
+ cocoindex-0.2.11.dist-info/RECORD,,
@@ -45,7 +45,7 @@
45
45
  <h2>Overview of licenses:</h2>
46
46
  <ul class="licenses-overview">
47
47
  <li><a href="#Apache-2.0">Apache License 2.0</a> (412)</li>
48
- <li><a href="#MIT">MIT License</a> (124)</li>
48
+ <li><a href="#MIT">MIT License</a> (125)</li>
49
49
  <li><a href="#Unicode-3.0">Unicode License v3</a> (19)</li>
50
50
  <li><a href="#ISC">ISC License</a> (8)</li>
51
51
  <li><a href="#BSD-3-Clause">BSD 3-Clause &quot;New&quot; or &quot;Revised&quot; License</a> (6)</li>
@@ -2428,7 +2428,7 @@ Software.
2428
2428
  <h3 id="Apache-2.0">Apache License 2.0</h3>
2429
2429
  <h4>Used by:</h4>
2430
2430
  <ul class="license-used-by">
2431
- <li><a href=" https://crates.io/crates/cocoindex ">cocoindex 0.2.9</a></li>
2431
+ <li><a href=" https://crates.io/crates/cocoindex ">cocoindex 0.2.11</a></li>
2432
2432
  <li><a href=" https://github.com/awesomized/crc-fast-rust ">crc-fast 1.3.0</a></li>
2433
2433
  <li><a href=" https://github.com/qdrant/rust-client ">qdrant-client 1.15.0</a></li>
2434
2434
  </ul>
@@ -11376,6 +11376,20 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
11376
11376
  IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
11377
11377
  DEALINGS IN THE SOFTWARE.
11378
11378
  </pre>
11379
+ </li>
11380
+ <li class="license">
11381
+ <h3 id="MIT">MIT License</h3>
11382
+ <h4>Used by:</h4>
11383
+ <ul class="license-used-by">
11384
+ <li><a href=" https://github.com/JoranHonig/tree-sitter-solidity ">tree-sitter-solidity 1.2.13</a></li>
11385
+ </ul>
11386
+ <pre class="license-text">Copyright (c) 2020 Joran Honig
11387
+
11388
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &quot;Software&quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
11389
+
11390
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11391
+
11392
+ THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</pre>
11379
11393
  </li>
11380
11394
  <li class="license">
11381
11395
  <h3 id="MIT">MIT License</h3>