indexify 0.2.40__py3-none-any.whl → 0.2.41__py3-none-any.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.
Files changed (42) hide show
  1. indexify/cli.py +92 -52
  2. indexify/executor/agent.py +99 -187
  3. indexify/executor/api_objects.py +2 -8
  4. indexify/executor/downloader.py +129 -90
  5. indexify/executor/executor_tasks.py +15 -30
  6. indexify/executor/function_executor/function_executor.py +32 -0
  7. indexify/executor/function_executor/function_executor_factory.py +26 -0
  8. indexify/executor/function_executor/function_executor_map.py +91 -0
  9. indexify/executor/function_executor/process_function_executor.py +64 -0
  10. indexify/executor/function_executor/process_function_executor_factory.py +102 -0
  11. indexify/executor/function_worker.py +227 -184
  12. indexify/executor/runtime_probes.py +9 -8
  13. indexify/executor/task_fetcher.py +80 -0
  14. indexify/executor/task_reporter.py +18 -25
  15. indexify/executor/task_store.py +35 -16
  16. indexify/function_executor/function_executor_service.py +86 -0
  17. indexify/function_executor/handlers/run_function/function_inputs_loader.py +54 -0
  18. indexify/function_executor/handlers/run_function/handler.py +149 -0
  19. indexify/function_executor/handlers/run_function/request_validator.py +24 -0
  20. indexify/function_executor/handlers/run_function/response_helper.py +98 -0
  21. indexify/function_executor/initialize_request_validator.py +22 -0
  22. indexify/function_executor/proto/configuration.py +13 -0
  23. indexify/function_executor/proto/function_executor.proto +70 -0
  24. indexify/function_executor/proto/function_executor_pb2.py +53 -0
  25. indexify/function_executor/proto/function_executor_pb2.pyi +125 -0
  26. indexify/function_executor/proto/function_executor_pb2_grpc.py +163 -0
  27. indexify/function_executor/proto/message_validator.py +38 -0
  28. indexify/function_executor/server.py +31 -0
  29. indexify/functions_sdk/data_objects.py +0 -9
  30. indexify/functions_sdk/graph.py +10 -11
  31. indexify/functions_sdk/graph_definition.py +2 -2
  32. indexify/functions_sdk/image.py +35 -30
  33. indexify/functions_sdk/indexify_functions.py +5 -5
  34. indexify/http_client.py +15 -23
  35. indexify/logging.py +32 -0
  36. {indexify-0.2.40.dist-info → indexify-0.2.41.dist-info}/METADATA +3 -1
  37. indexify-0.2.41.dist-info/RECORD +53 -0
  38. indexify/executor/indexify_executor.py +0 -32
  39. indexify-0.2.40.dist-info/RECORD +0 -34
  40. {indexify-0.2.40.dist-info → indexify-0.2.41.dist-info}/LICENSE.txt +0 -0
  41. {indexify-0.2.40.dist-info → indexify-0.2.41.dist-info}/WHEEL +0 -0
  42. {indexify-0.2.40.dist-info → indexify-0.2.41.dist-info}/entry_points.txt +0 -0
indexify/http_client.py CHANGED
@@ -64,7 +64,6 @@ class IndexifyClient:
64
64
  self._service_url = service_url
65
65
  self._timeout = kwargs.get("timeout")
66
66
  self._graphs: Dict[str, Graph] = {}
67
- self._fns: Dict[str, IndexifyFunction] = {}
68
67
  self._api_key = api_key
69
68
  if not self._api_key:
70
69
  print(
@@ -174,8 +173,6 @@ class IndexifyClient:
174
173
  )
175
174
  response.raise_for_status()
176
175
  self._graphs[graph.name] = graph
177
- for fn_name, fn in graph.nodes.items():
178
- self._fns[f"{graph.name}/{fn_name}"] = fn
179
176
 
180
177
  def delete_compute_graph(
181
178
  self,
@@ -191,21 +188,18 @@ class IndexifyClient:
191
188
  )
192
189
  response.raise_for_status()
193
190
 
194
- def graphs(self) -> List[str]:
195
- response = self._get(f"graphs")
196
- return response.json()["graphs"]
191
+ def graphs(self, namespace="default") -> List[ComputeGraphMetadata]:
192
+ response = self._get(f"namespaces/{namespace}/compute_graphs")
193
+ graphs = []
194
+ for graph in response.json()["compute_graphs"]:
195
+ graphs.append(ComputeGraphMetadata(**graph))
196
+
197
+ return graphs
197
198
 
198
199
  def graph(self, name: str) -> ComputeGraphMetadata:
199
200
  response = self._get(f"namespaces/{self.namespace}/compute_graphs/{name}")
200
201
  return ComputeGraphMetadata(**response.json())
201
202
 
202
- def load_fn(self, name: str, fn_name: str) -> IndexifyFunction:
203
- response = self._get(
204
- f"internal/namespaces/{self.namespace}/compute_graphs/{name}/code"
205
- )
206
- pickled_functions_by_name = cloudpickle.loads(response.content)
207
- return cloudpickle.loads(pickled_functions_by_name[fn_name])
208
-
209
203
  def namespaces(self) -> List[str]:
210
204
  response = self._get(f"namespaces")
211
205
  namespaces_dict = response.json()["namespaces"]
@@ -351,30 +345,27 @@ class IndexifyClient:
351
345
  )
352
346
  response.raise_for_status()
353
347
  content_type = response.headers.get("Content-Type")
354
- if content_type == "application/octet-stream":
355
- encoding = "cloudpickle"
356
- else:
348
+ if content_type == "application/json":
357
349
  encoding = "json"
350
+ else:
351
+ encoding = "cloudpickle"
358
352
  return IndexifyData(id=output_id, payload=response.content, encoder=encoding)
359
353
 
360
354
  def graph_outputs(
361
355
  self,
362
356
  graph: str,
363
357
  invocation_id: str,
364
- fn_name: Optional[str],
358
+ fn_name: str,
365
359
  ) -> List[Any]:
366
360
  """
367
361
  Returns the extracted objects by a graph for an ingested object. If the extractor name is provided, only the objects extracted by that extractor are returned.
368
362
  If the extractor name is not provided, all the extracted objects are returned for the input object.
369
363
  graph: str: The name of the graph
370
- invocation_id: str: The ID of the ingested object
371
- extractor_name: Optional[str]: The name of the extractor whose output is to be returned if provided
372
- block_until_done: bool = True: If True, the method will block until the extraction is done. If False, the method will return immediately.
364
+ invocation_id: str: The ID of the invocation.
365
+ fn_name: Optional[str]: The name of the function whose output is to be returned if provided
373
366
  return: Union[Dict[str, List[Any]], List[Any]]: The extracted objects. If the extractor name is provided, the output is a list of extracted objects by the extractor. If the extractor name is not provided, the output is a dictionary with the extractor name as the key and the extracted objects as the value. If no objects are found, an empty list is returned.
374
367
  """
375
368
  fn_key = f"{graph}/{fn_name}"
376
- if fn_key not in self._fns:
377
- self._fns[fn_key] = self.load_fn(graph, fn_name)
378
369
  response = self._get(
379
370
  f"namespaces/{self.namespace}/compute_graphs/{graph}/invocations/{invocation_id}/outputs",
380
371
  )
@@ -388,7 +379,8 @@ class IndexifyClient:
388
379
  indexify_data = self._download_output(
389
380
  self.namespace, graph, invocation_id, fn_name, output.id
390
381
  )
391
- output = self._fns[fn_key].deserialize_output(indexify_data)
382
+ serializer = get_serializer(indexify_data.encoder)
383
+ output = serializer.deserialize(indexify_data.payload)
392
384
  outputs.append(output)
393
385
  return outputs
394
386
 
indexify/logging.py ADDED
@@ -0,0 +1,32 @@
1
+ import logging
2
+ import sys
3
+
4
+ import structlog
5
+
6
+ # Using this module allows us to be consistent with the logging configuration across all Python programs.
7
+
8
+
9
+ def configure_logging_early():
10
+ """Configures standard Python logging module.
11
+
12
+ By default 3rd party modules that are using standard Python logging module
13
+ (logging.getLogger()) have their log lines dropped unless the module gets configured.
14
+
15
+ Not dropping log lines from 3rd party modules is useful for debugging. E.g. this helps
16
+ debugging errors in grpc servers if exceptions happen inside grpc module code.
17
+ """
18
+ logging.basicConfig(
19
+ level=logging.WARNING,
20
+ # This log message format is a bit similar to the default structlog format.
21
+ format="%(asctime)s [%(levelname)s] %(message)s logger=%(name)s",
22
+ datefmt="%Y-%m-%d %H:%M:%S",
23
+ handlers=[logging.StreamHandler(sys.stdout)],
24
+ )
25
+
26
+
27
+ def configure_production_logging():
28
+ processors = [
29
+ structlog.processors.dict_tracebacks,
30
+ structlog.processors.JSONRenderer(),
31
+ ]
32
+ structlog.configure(processors=processors)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: indexify
3
- Version: 0.2.40
3
+ Version: 0.2.41
4
4
  Summary: Python Client for Indexify
5
5
  Home-page: https://github.com/tensorlakeai/indexify
6
6
  License: Apache 2.0
@@ -16,6 +16,8 @@ Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Programming Language :: Python :: 3.13
17
17
  Requires-Dist: cloudpickle (>=3.1.0,<4.0.0)
18
18
  Requires-Dist: docker (>=7.1.0,<8.0.0)
19
+ Requires-Dist: grpcio (==1.68.1)
20
+ Requires-Dist: grpcio-tools (==1.68.1)
19
21
  Requires-Dist: httpx-sse (>=0.4.0,<0.5.0)
20
22
  Requires-Dist: httpx[http2] (==0.27.2)
21
23
  Requires-Dist: nanoid (>=2.0.0,<3.0.0)
@@ -0,0 +1,53 @@
1
+ indexify/__init__.py,sha256=P0mvM8sbkeS2CjYzRYyzb42CnXGhyJXdz4FdmTBMSWM,697
2
+ indexify/cli.py,sha256=a6KPM7uWE3kcbREP1IkkY3Z30vJ-9B_70r6j9-1msSk,10385
3
+ indexify/common_util.py,sha256=LKS6yZ3yv8nF2J-KzisGIjqjTvCn7tLFifQJLT4gHRg,3529
4
+ indexify/data_loaders/__init__.py,sha256=Y5NEuseTcYAICRiweYw5wBQ2m2YplbsY21I7df-rdi4,1339
5
+ indexify/data_loaders/local_directory_loader.py,sha256=fCrgj5drnW71ZUdDDvcB1-VJjIs1w6Q8sEW0HSGSAiA,1247
6
+ indexify/data_loaders/url_loader.py,sha256=32SERljcq1Xsi4RdLz2dgyk2TER5pQPTtXl3gUzwHbY,1533
7
+ indexify/error.py,sha256=qAWr8R6AxPkjsxHSzXTc8zqYnNO_AjOqqYEPsQvF1Zs,238
8
+ indexify/executor/agent.py,sha256=vPbGUN2E9N6fa7WDCpzUD4CzNwSnDMQ0_vs1d5R61GU,10902
9
+ indexify/executor/api_objects.py,sha256=vp7aEjvfWL2j4nYDV0xLgLVZlGsbStMEu0nzrgJVq1A,741
10
+ indexify/executor/downloader.py,sha256=oeiSGxIIn7uBTKT6hzyPUa-AlOUlqy7WQkinm7qpV0I,6442
11
+ indexify/executor/executor_tasks.py,sha256=vxXK2pCSqu5_HaEPKj2VF9k8vgA1mUD8v4bx0TXGR-I,1570
12
+ indexify/executor/function_executor/function_executor.py,sha256=0W6vCT-DBVPUMPoOXLVRVHZjVGGUeTDV_NWb-XLP2gM,1218
13
+ indexify/executor/function_executor/function_executor_factory.py,sha256=23BU_i47Tz6xd9fAwsKH29lm261bZXfzYGRhSqeFtwY,900
14
+ indexify/executor/function_executor/function_executor_map.py,sha256=HXeCjkRusumJisU74Iy6M4e13k8jeHk4Yq8PyODSsUc,3922
15
+ indexify/executor/function_executor/process_function_executor.py,sha256=CdqFtvlvS_VIzVdbE3Wnzj_Kqfzhzf4X05avHIielEE,2150
16
+ indexify/executor/function_executor/process_function_executor_factory.py,sha256=ognYRd5l10kVD2KAShfkd8vg-JElYctG77Pcx77-grM,3850
17
+ indexify/executor/function_worker.py,sha256=JcVrDZPj6XE0c-SDyXMlS5ZMfr5FuByZxG2XoACHsoU,9803
18
+ indexify/executor/runtime_probes.py,sha256=bo6Dq6AGZpJH099j0DHtVSDEH80tv3j9MXf3VXSx_p8,2182
19
+ indexify/executor/task_fetcher.py,sha256=481Ta7UAlytDpf99wNGzcqaCpB7NGJitb1nn_rAE9Do,3017
20
+ indexify/executor/task_reporter.py,sha256=jThbGHte8nBikBIiSFgjRUQ6o3wE3Ms2zyz1NaZWIUQ,5113
21
+ indexify/executor/task_store.py,sha256=Gpsr7S6UuLhGiB4Vh-9A0-iU4Qgji5CYEzjwKWeETl4,4430
22
+ indexify/function_executor/function_executor_service.py,sha256=EwwHTPX-AVqbSl-BONWWy3Z6gowXnYj5tigGoFs1u0s,3694
23
+ indexify/function_executor/handlers/run_function/function_inputs_loader.py,sha256=x2Lrzb6CsEWDWW5qG9etS7TyV7KVYfuFKEbzKVhYizo,1553
24
+ indexify/function_executor/handlers/run_function/handler.py,sha256=eklicxgyExd9ScdDahQO9LaLNXPNBPAAI0KBt3Wb9-w,5636
25
+ indexify/function_executor/handlers/run_function/request_validator.py,sha256=tVmbOS2g4AeV48CZCSDRycnoQjjGy12XD_vbaOLX_Z4,740
26
+ indexify/function_executor/handlers/run_function/response_helper.py,sha256=KDSadee08g6JRFwKRTdcOwbP6SmRJCGVHh1FOLdt_ws,3109
27
+ indexify/function_executor/initialize_request_validator.py,sha256=AtyKgIjlGHB-Fh3Vhso86TC0o65DfuVEY8GFfRSfylo,709
28
+ indexify/function_executor/proto/configuration.py,sha256=P0xtxwf-XaCxi0kvtCbm4X8y0YOuHhR-uh9xUuLdFoM,595
29
+ indexify/function_executor/proto/function_executor.proto,sha256=PiftSSIDjHkxUbD7rNVmgfTCP12bFJ7oKJXuRx2sM28,2188
30
+ indexify/function_executor/proto/function_executor_pb2.py,sha256=tEDJJUywM6-j4dBwvBEHXnGCv9spGWVuhtHuiTDxw7I,4582
31
+ indexify/function_executor/proto/function_executor_pb2.pyi,sha256=E-UnFIFbej-QPhaX1X4oYGeUW6_HuEi13qhCYkN1tzI,4182
32
+ indexify/function_executor/proto/function_executor_pb2_grpc.py,sha256=OIErF2wYWaRI2TyF8EbWGjj5K9aD7OIJwAp1BRMQ0ic,6265
33
+ indexify/function_executor/proto/message_validator.py,sha256=IkIHryanhFMRM6IU9F0nsGIlcEktXgcbomLFTWtPWYU,1418
34
+ indexify/function_executor/server.py,sha256=YEeKHR6qjNJyLFb8KNjcCYClBgVzdJNmKwdwmyJ-ybE,1136
35
+ indexify/functions_sdk/data_objects.py,sha256=ZJ7B9b5OI7aieCWJFx18pV6tqScssIFtmth84i7nKTg,623
36
+ indexify/functions_sdk/graph.py,sha256=WNaS5yGNKNLa55gH3LPIlp4fH9VpAsb7VAVkELozrZ0,13413
37
+ indexify/functions_sdk/graph_definition.py,sha256=yQ7c7jpA8RB8Yt81D1i5R3LPT8fmLvN8bLuEHvS4P_o,1775
38
+ indexify/functions_sdk/graph_validation.py,sha256=mN2Fcp91GIwFZEQP6z_qGqt4LkLM70SnI7AWBi4CmKQ,2509
39
+ indexify/functions_sdk/image.py,sha256=wVDs5O5yshjSSZ1d-keyMp9zUrck2TazJlkVq94jMZk,1965
40
+ indexify/functions_sdk/indexify_functions.py,sha256=USuEeZnbQTd6uUjv-ZAwdBrbR8gGrTD78oXjyW6DBbw,13376
41
+ indexify/functions_sdk/local_cache.py,sha256=cNWF67zbhbTJe3g86hyLBy3Rqzs6dNvp2SjLazGZWvw,1348
42
+ indexify/functions_sdk/object_serializer.py,sha256=R58ALsl2Lb87ii6km4D6hBBsqRs_CHNISxhUICE2d9o,1931
43
+ indexify/functions_sdk/pipeline.py,sha256=KmxZE8eBFAQ4bbEcYURXXR26HSyoAT3O6iu9H38-OXE,974
44
+ indexify/http_client.py,sha256=XvIi7z7h7PZomMKlL8WEhFIWAAPzFe2hrLQUz4QC_Zc,15392
45
+ indexify/logging.py,sha256=_TLnWT0RzABvExwTixjdpuxoSNUev4zeNV0K1VlEUmA,1099
46
+ indexify/remote_graph.py,sha256=OzBucU4buR5UdTViNJvh1RfnOTmYA34Uel5qXnRsQsA,5006
47
+ indexify/remote_pipeline.py,sha256=oqx57rSPszNS3DToXO_nf-CKqkCZWptm1u_p3orV_gQ,790
48
+ indexify/settings.py,sha256=Ny59mzYI4gbXoK8hjx66a_men6ndbd1J1zCTcKOoyzg,50
49
+ indexify-0.2.41.dist-info/LICENSE.txt,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
50
+ indexify-0.2.41.dist-info/METADATA,sha256=j9wkgdgqWKprrfh0sXEhs4yVTWnEs54M9bWWnVEFBmo,6271
51
+ indexify-0.2.41.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
52
+ indexify-0.2.41.dist-info/entry_points.txt,sha256=Pih7WV-XMpAzI5dEvROcpLr-ybVhd9Y-AtuzBKUdcDs,49
53
+ indexify-0.2.41.dist-info/RECORD,,
@@ -1,32 +0,0 @@
1
- import asyncio
2
- from typing import List, Optional
3
-
4
- import nanoid
5
-
6
- from .agent import ExtractorAgent
7
- from .function_worker import FunctionWorker
8
-
9
-
10
- def join(
11
- workers: int,
12
- server_addr: str = "localhost:8900",
13
- config_path: Optional[str] = None,
14
- ):
15
- print(f"receiving tasks from server addr: {server_addr}")
16
- id = nanoid.generate()
17
- print(f"executor id: {id}")
18
-
19
- function_worker = FunctionWorker(workers=workers)
20
-
21
- agent = ExtractorAgent(
22
- id,
23
- num_workers=workers,
24
- function_worker=function_worker,
25
- server_addr=server_addr,
26
- config_path=config_path,
27
- )
28
-
29
- try:
30
- asyncio.get_event_loop().run_until_complete(agent.run())
31
- except asyncio.CancelledError as ex:
32
- print("exiting gracefully", ex)
@@ -1,34 +0,0 @@
1
- indexify/__init__.py,sha256=P0mvM8sbkeS2CjYzRYyzb42CnXGhyJXdz4FdmTBMSWM,697
2
- indexify/cli.py,sha256=QqaRpm-XywJQ3zh-2pgABi15Jl0IkwA_sz6PRNvQ4wc,8872
3
- indexify/common_util.py,sha256=LKS6yZ3yv8nF2J-KzisGIjqjTvCn7tLFifQJLT4gHRg,3529
4
- indexify/data_loaders/__init__.py,sha256=Y5NEuseTcYAICRiweYw5wBQ2m2YplbsY21I7df-rdi4,1339
5
- indexify/data_loaders/local_directory_loader.py,sha256=fCrgj5drnW71ZUdDDvcB1-VJjIs1w6Q8sEW0HSGSAiA,1247
6
- indexify/data_loaders/url_loader.py,sha256=32SERljcq1Xsi4RdLz2dgyk2TER5pQPTtXl3gUzwHbY,1533
7
- indexify/error.py,sha256=qAWr8R6AxPkjsxHSzXTc8zqYnNO_AjOqqYEPsQvF1Zs,238
8
- indexify/executor/agent.py,sha256=6xcGDZLwFHlFDiqW9EOI_Dfxh8ahdhGZq4PZUoyPLEY,14167
9
- indexify/executor/api_objects.py,sha256=mvmwGbK4paJNQGFvbtNHMPpiH_LpVhrlRnCcrqS6HOQ,859
10
- indexify/executor/downloader.py,sha256=dHLxoBnX8-Bh4yZtFDYptZNF6rlVtmTk_70JK8Ect5w,4184
11
- indexify/executor/executor_tasks.py,sha256=A0UIEZ5VaB6zSkFQG81UmTW0E57MTYhGlaXuAbRV8lQ,1884
12
- indexify/executor/function_worker.py,sha256=wRW2-X9dNI80KhwTD1vD-pcyetsVKVs6vVdg7L7JjcQ,6462
13
- indexify/executor/indexify_executor.py,sha256=2Ut_VX-Su_lm4b4aEROyRJ3gXx-uFHA-V7EN0sWiARE,771
14
- indexify/executor/runtime_probes.py,sha256=mjw2_mGQ622wRT_39WPGGgPEZQTgtrf3-ICcUUZOeyg,2126
15
- indexify/executor/task_reporter.py,sha256=XlEhNf_ScNnzG67zbtVwL7_9Bo8MvPZiHLI5UHymUnM,5305
16
- indexify/executor/task_store.py,sha256=JlRlWwAm4YjFRkTNRx-6GsUcmOzcyvzb5Csa5XDpRTI,3982
17
- indexify/functions_sdk/data_objects.py,sha256=wXbUa9hjU6rsXmmk19vQ5Kixf3FsI59VBWPNmHasAX0,854
18
- indexify/functions_sdk/graph.py,sha256=jZSOVmlQB8Eb8MBz0TeRADl_4y5rnrjdTTy6VdRLISY,13448
19
- indexify/functions_sdk/graph_definition.py,sha256=W3zRERTOC-UbiRms-NqvtlLDpSZM-33TocKeZXb5o_A,1762
20
- indexify/functions_sdk/graph_validation.py,sha256=mN2Fcp91GIwFZEQP6z_qGqt4LkLM70SnI7AWBi4CmKQ,2509
21
- indexify/functions_sdk/image.py,sha256=QK0H6KxLWriB_z4M0kunKzzHdHxYLWL670RPYgYuf_8,1762
22
- indexify/functions_sdk/indexify_functions.py,sha256=kjGmkRYnA_KO5ypkyaIhqrz0-3UJOFTPGldgOrHSRHY,13401
23
- indexify/functions_sdk/local_cache.py,sha256=cNWF67zbhbTJe3g86hyLBy3Rqzs6dNvp2SjLazGZWvw,1348
24
- indexify/functions_sdk/object_serializer.py,sha256=R58ALsl2Lb87ii6km4D6hBBsqRs_CHNISxhUICE2d9o,1931
25
- indexify/functions_sdk/pipeline.py,sha256=KmxZE8eBFAQ4bbEcYURXXR26HSyoAT3O6iu9H38-OXE,974
26
- indexify/http_client.py,sha256=iLafZagCFnlTS6uHfOjInogjg0uXW_zXEspIN7ttB5I,15903
27
- indexify/remote_graph.py,sha256=OzBucU4buR5UdTViNJvh1RfnOTmYA34Uel5qXnRsQsA,5006
28
- indexify/remote_pipeline.py,sha256=oqx57rSPszNS3DToXO_nf-CKqkCZWptm1u_p3orV_gQ,790
29
- indexify/settings.py,sha256=Ny59mzYI4gbXoK8hjx66a_men6ndbd1J1zCTcKOoyzg,50
30
- indexify-0.2.40.dist-info/LICENSE.txt,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
31
- indexify-0.2.40.dist-info/METADATA,sha256=x-8XRtgGLpvgQ5fEXUxamZwgoNtGCWPcbyvAgciO2HE,6199
32
- indexify-0.2.40.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
33
- indexify-0.2.40.dist-info/entry_points.txt,sha256=Pih7WV-XMpAzI5dEvROcpLr-ybVhd9Y-AtuzBKUdcDs,49
34
- indexify-0.2.40.dist-info/RECORD,,