|
22 | 22 | )
|
23 | 23 |
|
24 | 24 | from fsspec.asyn import get_loop
|
25 |
| -from funcy import cached_property |
| 25 | +from funcy import cached_property, once_per_args |
26 | 26 |
|
27 | 27 | from ..executors import ThreadPoolExecutor, batch_coros
|
28 | 28 | from .callbacks import DEFAULT_CALLBACK, Callback
|
@@ -58,6 +58,33 @@ def __init__(self, link: str, fs: "FileSystem", path: str) -> None:
|
58 | 58 | )
|
59 | 59 |
|
60 | 60 |
|
| 61 | +@once_per_args |
| 62 | +def check_required_version( |
| 63 | + pkg: str, dist: str = "dvc_objects", log_level=logging.WARNING |
| 64 | +): |
| 65 | + from importlib import metadata |
| 66 | + |
| 67 | + from packaging.requirements import InvalidRequirement, Requirement |
| 68 | + |
| 69 | + try: |
| 70 | + reqs = { |
| 71 | + r.name: r.specifier for r in map(Requirement, metadata.requires(dist) or []) |
| 72 | + } |
| 73 | + version = metadata.version(pkg) |
| 74 | + except (metadata.PackageNotFoundError, InvalidRequirement): |
| 75 | + return |
| 76 | + |
| 77 | + specifier = reqs.get(pkg) |
| 78 | + if specifier and version and version not in specifier: |
| 79 | + logger.log( |
| 80 | + log_level, |
| 81 | + "'%s%s' is required, but you have %r installed which is incompatible.", |
| 82 | + pkg, |
| 83 | + specifier, |
| 84 | + version, |
| 85 | + ) |
| 86 | + |
| 87 | + |
61 | 88 | class FileSystem:
|
62 | 89 | sep = "/"
|
63 | 90 |
|
@@ -142,6 +169,7 @@ def get_missing_deps(cls) -> List[str]:
|
142 | 169 | def _check_requires(self, **kwargs):
|
143 | 170 | from .scheme import Schemes
|
144 | 171 |
|
| 172 | + check_required_version(pkg="fsspec") |
145 | 173 | missing = self.get_missing_deps()
|
146 | 174 | if not missing:
|
147 | 175 | return
|
|
0 commit comments