File tree Expand file tree Collapse file tree 2 files changed +41
-1
lines changed
src/lightning_utilities/core Expand file tree Collapse file tree 2 files changed +41
-1
lines changed Original file line number Diff line number Diff line change 4
4
import importlib
5
5
import operator
6
6
from functools import lru_cache
7
+ from importlib import metadata
7
8
from importlib .util import find_spec
8
9
from typing import Callable
9
10
10
11
import pkg_resources
12
+ from packaging .requirements import Requirement
11
13
from packaging .version import Version
12
14
13
15
@@ -107,3 +109,21 @@ def __str__(self) -> str:
107
109
108
110
def __repr__ (self ) -> str :
109
111
return self .__str__ ()
112
+
113
+
114
+ def get_dependency_min_version_spec (package_name : str , dependency_name : str ) -> str :
115
+ """Returns the minimum version specifier of a dependency of a package.
116
+
117
+ >>> get_dependency_min_version_spec("pytorch-lightning", "jsonargparse")
118
+ '>=4.12.0'
119
+ """
120
+ dependencies = metadata .requires (package_name ) or []
121
+ for dep in dependencies :
122
+ dependency = Requirement (dep )
123
+ if dependency .name == dependency_name :
124
+ spec = [str (s ) for s in dependency .specifier if str (s )[0 ] == ">" ]
125
+ return spec [0 ] if spec else ""
126
+ raise ValueError (
127
+ "This is an internal error. Please file a GitHub issue with the error message. Dependency "
128
+ f"{ dependency_name !r} not found in package { package_name !r} ."
129
+ )
Original file line number Diff line number Diff line change 1
1
import operator
2
+ import re
3
+ from importlib .metadata import PackageNotFoundError
2
4
3
- from lightning_utilities .core .imports import compare_version , module_available , RequirementCache
5
+ import pytest
6
+
7
+ from lightning_utilities .core .imports import (
8
+ compare_version ,
9
+ get_dependency_min_version_spec ,
10
+ module_available ,
11
+ RequirementCache ,
12
+ )
4
13
5
14
6
15
def test_module_exists ():
@@ -38,3 +47,14 @@ def test_requirement_cache():
38
47
assert RequirementCache (f"pytest>={ pytest .__version__ } " )
39
48
assert not RequirementCache (f"pytest<{ pytest .__version__ } " )
40
49
assert "pip install -U '-'" in str (RequirementCache ("-" ))
50
+
51
+
52
+ def test_get_dependency_min_version_spec ():
53
+ attrs_min_version_spec = get_dependency_min_version_spec ("pytest" , "attrs" )
54
+ assert re .match (r"^>=[\d.]+$" , attrs_min_version_spec )
55
+
56
+ with pytest .raises (ValueError , match = "'invalid' not found in package 'pytest'" ):
57
+ get_dependency_min_version_spec ("pytest" , "invalid" )
58
+
59
+ with pytest .raises (PackageNotFoundError , match = "invalid" ):
60
+ get_dependency_min_version_spec ("invalid" , "invalid" )
You can’t perform that action at this time.
0 commit comments