Skip to content

Commit 1251baa

Browse files
Fix minversion TypeError with dev version strings
Switch to packaging.version.Version for version comparison to handle PEP 440 dev/rc versions correctly. This resolves failures introduced by PR astropy#7647 and avoids distutils' LooseVersion bug (see python/cpython#30272). Add tests for dev/rc version handling in minversion.
1 parent a7141cd commit 1251baa

2 files changed

Lines changed: 42 additions & 3 deletions

File tree

astropy/utils/introspection.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import inspect
77
import types
88
import importlib
9-
from distutils.version import LooseVersion
9+
from packaging.version import Version
1010

1111

1212
__all__ = ['resolve_name', 'minversion', 'find_current_module',
@@ -140,9 +140,9 @@ def minversion(module, version, inclusive=True, version_path='__version__'):
140140
have_version = resolve_name(module.__name__, version_path)
141141

142142
if inclusive:
143-
return LooseVersion(have_version) >= LooseVersion(version)
143+
return Version(have_version) >= Version(version)
144144
else:
145-
return LooseVersion(have_version) > LooseVersion(version)
145+
return Version(have_version) > Version(version)
146146

147147

148148
def find_current_module(depth=1, finddiff=False):

astropy/utils/tests/test_introspection.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,42 @@ def test_minversion():
7373
assert minversion(test_module, version)
7474
for version in bad_versions:
7575
assert not minversion(test_module, version)
76+
77+
78+
def test_minversion_dev_version():
79+
"""Test minversion with dev version strings (issue from PR #7647)"""
80+
from types import ModuleType
81+
82+
# Test the specific case that was failing
83+
test_module = ModuleType(str("test_module"))
84+
test_module.__version__ = '1.14.3'
85+
assert minversion(test_module, '1.14dev')
86+
87+
# Test without the patch version - in PEP 440, '1.14' is a stable release
88+
# which is > '1.14dev' (dev version comes before release)
89+
test_module.__version__ = '1.14'
90+
assert minversion(test_module, '1.14dev')
91+
92+
# Test more dev version scenarios
93+
test_module.__version__ = '1.15.0'
94+
assert minversion(test_module, '1.14dev')
95+
assert minversion(test_module, '1.15dev')
96+
97+
# Test with rc versions
98+
test_module.__version__ = '1.14.3'
99+
assert minversion(test_module, '1.14rc1')
100+
101+
# Test dev version being checked against stable
102+
test_module.__version__ = '1.14dev'
103+
assert not minversion(test_module, '1.14.3')
104+
105+
# Test alpha/beta versions
106+
test_module.__version__ = '1.14.3'
107+
assert minversion(test_module, '1.14a1')
108+
assert minversion(test_module, '1.14b1')
109+
110+
# Test with inclusive=False
111+
test_module.__version__ = '1.14.3'
112+
assert minversion(test_module, '1.14dev', inclusive=False)
113+
assert minversion(test_module, '1.14.2', inclusive=False)
114+
assert not minversion(test_module, '1.14.3', inclusive=False)

0 commit comments

Comments
 (0)