Skip to content

Commit 286d365

Browse files
committed
Fix handling of maximum python version in pick_python_cmd
When the minor version is unset, only the major version must be checked. Otherwise patch versions etc. must be ignored. This allows: 3.7.4 for "max_py_majver=3" and "max_py_majver=3 max_py_minver=7"
1 parent 8b3f9f8 commit 286d365

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

easybuild/easyblocks/generic/pythonpackage.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def check_python_cmd(python_cmd):
110110
log.debug(f"Python command '{python_cmd}' not available through $PATH")
111111
return False
112112

113-
pyver = det_python_version(python_cmd)
113+
pyver = LooseVersion(det_python_version(python_cmd))
114114

115115
if req_maj_ver is not None:
116116
if req_min_ver is None:
@@ -119,26 +119,28 @@ def check_python_cmd(python_cmd):
119119
req_majmin_ver = '%s.%s' % (req_maj_ver, req_min_ver)
120120

121121
# (strict) check for major version
122-
maj_ver = pyver.split('.')[0]
123-
if maj_ver != str(req_maj_ver):
122+
maj_ver = pyver.version[0]
123+
if maj_ver != req_maj_ver:
124124
log.debug(f"Major Python version does not match: {maj_ver} vs {req_maj_ver}")
125125
return False
126126

127127
# check for minimal minor version
128-
if LooseVersion(pyver) < LooseVersion(req_majmin_ver):
128+
if pyver < req_majmin_ver:
129129
log.debug(f"Minimal requirement for minor Python version not satisfied: {pyver} vs {req_majmin_ver}")
130130
return False
131131

132132
if max_py_majver is not None:
133133
if max_py_minver is None:
134-
max_majmin_ver = '%s.0' % max_py_majver
134+
max_ver = int(max_py_majver)
135+
tested_pyver = pyver.version[0]
135136
else:
136-
max_majmin_ver = '%s.%s' % (max_py_majver, max_py_minver)
137+
max_ver = LooseVersion('%s.%s' % (max_py_majver, max_py_minver))
138+
# Make sure we test only until the minor version, because 3.9.3 > 3.9 but we want to allow this
139+
tested_pyver = '.'.join(str(v) for v in pyver.version[:2])
137140

138-
if LooseVersion(pyver) > LooseVersion(max_majmin_ver):
139-
log.debug("Python version (%s) on the system is newer than the maximum supported "
140-
"Python version specified in the easyconfig (%s)",
141-
pyver, max_majmin_ver)
141+
if tested_pyver > max_ver:
142+
log.debug(f"Python version ({pyver}) on the system is newer than the maximum supported "
143+
f"Python version specified in the easyconfig ({max_ver})")
142144
return False
143145

144146
# all check passed

test/easyblocks/module.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,20 @@ def test_pythonpackage_det_pylibdir(self):
229229
def test_pythonpackage_pick_python_cmd(self):
230230
"""Test pick_python_cmd function from pythonpackage.py."""
231231
from easybuild.easyblocks.generic.pythonpackage import pick_python_cmd
232-
self.assertTrue(pick_python_cmd() is not None)
233-
self.assertTrue(pick_python_cmd(3) is not None)
234-
self.assertTrue(pick_python_cmd(3, 6) is not None)
235-
self.assertTrue(pick_python_cmd(123, 456) is None)
236-
self.assertTrue(pick_python_cmd(2, 6, 123, 456) is not None)
237-
self.assertTrue(pick_python_cmd(2, 6, 1, 1) is None)
232+
self.assertIsNotNone(pick_python_cmd())
233+
self.assertIsNotNone(pick_python_cmd(3))
234+
self.assertIsNotNone(pick_python_cmd(3, 6))
235+
self.assertIsNone(pick_python_cmd(123, 456))
236+
self.assertIsNotNone(pick_python_cmd(2, 6, 123, 456))
237+
self.assertIsNotNone(pick_python_cmd(2, 6, 2))
238+
self.assertIsNone(pick_python_cmd(2, 6, 1, 1))
239+
maj_ver, min_ver = sys.version_info[0:2]
240+
self.assertIsNotNone(pick_python_cmd(maj_ver, min_ver))
241+
self.assertIsNotNone(pick_python_cmd(maj_ver, min_ver, max_py_majver=maj_ver))
242+
self.assertIsNotNone(pick_python_cmd(maj_ver, min_ver, max_py_majver=maj_ver, max_py_minver=min_ver))
243+
self.assertIsNotNone(pick_python_cmd(maj_ver, min_ver, max_py_majver=maj_ver, max_py_minver=min_ver + 1))
244+
self.assertIsNone(pick_python_cmd(maj_ver, min_ver, max_py_majver=maj_ver - 1))
245+
self.assertIsNone(pick_python_cmd(maj_ver, min_ver, max_py_majver=maj_ver, max_py_minver=min_ver - 1))
238246

239247

240248
def template_module_only_test(self, easyblock, name, version='1.3.2', extra_txt='', tmpdir=None):

0 commit comments

Comments
 (0)