Skip to content

Commit 61af91f

Browse files
authored
chore: Added informative import errors (#72)
* Added informative import errors * Added informative import errors * Bumped version * Added informative import errors
1 parent 0b3ec52 commit 61af91f

3 files changed

Lines changed: 28 additions & 3 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<div align="center">
88
<h2>
99
<a href="https://pypi.org/project/vicinity/"><img src="https://img.shields.io/pypi/v/vicinity?color=%23007ec6&label=pypi%20package" alt="Package version"></a>
10-
<a href="https://pypi.org/project/vicinity/"><img src="https://img.shields.io/pypi/pyversions/vicinity" alt="Supported Python versions"></a>
10+
<a href="https://minish.ai/packages/vicinity/introduction"><img src="https://img.shields.io/badge/docs-minish.ai-blue.svg" alt="Docs"></a>
1111
<a href="https://pepy.tech/project/vicinity">
1212
<img src="https://static.pepy.tech/badge/vicinity" alt="Downloads">
1313
</a>

vicinity/backends/__init__.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,64 @@
1+
from importlib.util import find_spec
12
from typing import Union
23

34
from vicinity.backends.base import AbstractBackend
45
from vicinity.backends.basic import BasicBackend, BasicVectorStore
56
from vicinity.datatypes import Backend
67

78

9+
class OptionalDependencyError(ImportError):
10+
def __init__(self, backend: Backend, extra: str) -> None:
11+
msg = f"{backend} requires extra '{extra}'.\n" f"Install it with: pip install 'vicinity[{extra}]'\n"
12+
super().__init__(msg)
13+
self.backend = backend
14+
self.extra = extra
15+
16+
17+
def _require(module_name: str, backend: Backend, extra: str) -> None:
18+
"""Check if a dependency is importable, otherwise raise an error."""
19+
if find_spec(module_name) is None:
20+
raise OptionalDependencyError(backend, extra)
21+
22+
823
def get_backend_class(backend: Union[Backend, str]) -> type[AbstractBackend]:
9-
"""Get all available backends."""
24+
"""Get the requested backend and ensure its dependencies are installed."""
1025
backend = Backend(backend)
26+
1127
if backend == Backend.BASIC:
1228
return BasicBackend
29+
1330
elif backend == Backend.HNSW:
31+
_require("hnswlib", backend, "hnsw")
1432
from vicinity.backends.hnsw import HNSWBackend
1533

1634
return HNSWBackend
35+
1736
elif backend == Backend.ANNOY:
37+
_require("annoy", backend, "annoy")
1838
from vicinity.backends.annoy import AnnoyBackend
1939

2040
return AnnoyBackend
41+
2142
elif backend == Backend.PYNNDESCENT:
43+
_require("pynndescent", backend, "pynndescent")
2244
from vicinity.backends.pynndescent import PyNNDescentBackend
2345

2446
return PyNNDescentBackend
2547

2648
elif backend == Backend.FAISS:
49+
_require("faiss", backend, "faiss")
2750
from vicinity.backends.faiss import FaissBackend
2851

2952
return FaissBackend
3053

3154
elif backend == Backend.USEARCH:
55+
_require("usearch", backend, "usearch")
3256
from vicinity.backends.usearch import UsearchBackend
3357

3458
return UsearchBackend
3559

3660
elif backend == Backend.VOYAGER:
61+
_require("voyager", backend, "voyager")
3762
from vicinity.backends.voyager import VoyagerBackend
3863

3964
return VoyagerBackend

vicinity/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
__version_triple__ = (0, 4, 2)
1+
__version_triple__ = (0, 4, 3)
22
__version__ = ".".join(map(str, __version_triple__))

0 commit comments

Comments
 (0)