Skip to content

Commit caafb60

Browse files
committed
Remove redundant usage of sort_looseversions
This now works directly. Also fix the sort_looseversions function for the distutils version of LooseVersion
1 parent e44b66d commit caafb60

File tree

3 files changed

+55
-31
lines changed

3 files changed

+55
-31
lines changed

easybuild/tools/docs.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
from easybuild.tools.config import build_option
5858
from easybuild.tools.filetools import read_file
5959
from easybuild.tools.modules import modules_tool
60-
from easybuild.tools.py2vs3 import OrderedDict, ascii_lowercase, sort_looseversions
60+
from easybuild.tools.py2vs3 import OrderedDict, ascii_lowercase
6161
from easybuild.tools.toolchain.toolchain import DUMMY_TOOLCHAIN_NAME, SYSTEM_TOOLCHAIN_NAME, is_system_toolchain
6262
from easybuild.tools.toolchain.utilities import search_toolchain
6363
from easybuild.tools.utilities import INDENT_2SPACES, INDENT_4SPACES
@@ -663,7 +663,7 @@ def key_to_ref(name):
663663
# sort pairs by version (and then by versionsuffix);
664664
# we sort by LooseVersion to obtain chronological version ordering,
665665
# but we also need to retain original string version for filtering-by-version done below
666-
sorted_pairs = sort_looseversions((LooseVersion(v), vs, v) for v, vs in pairs)
666+
sorted_pairs = sorted((LooseVersion(v), vs, v) for v, vs in pairs)
667667

668668
for _, vsuff, ver in sorted_pairs:
669669
table_values[0].append('``%s``' % ver)
@@ -721,7 +721,7 @@ def list_software_txt(software, detailed=False):
721721
# sort pairs by version (and then by versionsuffix);
722722
# we sort by LooseVersion to obtain chronological version ordering,
723723
# but we also need to retain original string version for filtering-by-version done below
724-
sorted_pairs = sort_looseversions((LooseVersion(v), vs, v) for v, vs in pairs)
724+
sorted_pairs = sorted((LooseVersion(v), vs, v) for v, vs in pairs)
725725

726726
for _, vsuff, ver in sorted_pairs:
727727
tcs = [x['toolchain'] for x in software[key] if x['version'] == ver and x['versionsuffix'] == vsuff]

easybuild/tools/py2vs3/py3.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import sys
3737
import urllib.request as std_urllib # noqa
3838
from collections import OrderedDict # noqa
39-
from easybuild.tools import LooseVersion
4039
from functools import cmp_to_key
4140
from html.parser import HTMLParser # noqa
4241
from itertools import zip_longest
@@ -49,6 +48,13 @@
4948
# importlib only works with Python 3.4 & newer
5049
from importlib import reload # noqa
5150

51+
# distutils is deprecated, so prepare for it being removed
52+
try:
53+
import distutils.version
54+
HAVE_DISTUTILS = True
55+
except ImportError:
56+
HAVE_DISTUTILS = False
57+
5258
# string type that can be used in 'isinstance' calls
5359
string_type = str
5460

@@ -120,7 +126,7 @@ def simple_compare(x1, x2):
120126
else:
121127
return 0
122128

123-
if isinstance(v1, LooseVersion) and isinstance(v2, LooseVersion):
129+
if isinstance(v1, distutils.version.LooseVersion) and isinstance(v2, distutils.version.LooseVersion):
124130
# implementation based on '14894.patch' patch file provided in https://bugs.python.org/issue14894
125131
for ver1_part, ver2_part in zip_longest(v1.version, v2.version, fillvalue=''):
126132
# use string comparison if version parts have different type
@@ -142,7 +148,10 @@ def simple_compare(x1, x2):
142148

143149

144150
def sort_looseversions(looseversions):
145-
"""Sort list of (values including) LooseVersion instances."""
151+
"""Sort list of (values including) distutils.version.LooseVersion instances."""
146152
# with Python 2, we can safely use 'sorted' on LooseVersion instances
147153
# (but we can't in Python 3, see https://bugs.python.org/issue14894)
148-
return sorted(looseversions, key=cmp_to_key(safe_cmp_looseversions))
154+
if HAVE_DISTUTILS:
155+
return sorted(looseversions, key=cmp_to_key(safe_cmp_looseversions))
156+
else:
157+
return sorted(looseversions)

test/framework/options.py

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6052,30 +6052,45 @@ def test_installdir(self):
60526052
self.assertTrue(eb.installdir.endswith('/software/Core/toy/0.0'))
60536053

60546054
def test_sort_looseversions(self):
6055-
"""Test sort_looseversions funuction."""
6056-
ver1 = LooseVersion('1.2.3')
6057-
ver2 = LooseVersion('4.5.6')
6058-
ver3 = LooseVersion('1.2.3dev')
6059-
ver4 = LooseVersion('system')
6060-
ver5 = LooseVersion('rc3')
6061-
ver6 = LooseVersion('v1802')
6062-
6063-
# some versions are included multiple times on purpose,
6064-
# to also test comparison between equal LooseVersion instances
6065-
input = [ver3, ver5, ver1, ver2, ver4, ver6, ver3, ver4, ver1]
6066-
expected = [ver1, ver1, ver3, ver3, ver2, ver5, ver4, ver4, ver6]
6067-
self.assertEqual(sort_looseversions(input), expected)
6068-
6069-
# also test on list of tuples consisting of a LooseVersion instance + a string
6070-
# (as in the list_software_* functions)
6071-
suff1 = ''
6072-
suff2 = '-foo'
6073-
suff3 = '-bar'
6074-
input = [(ver3, suff1), (ver5, suff3), (ver1, suff2), (ver2, suff3), (ver4, suff1),
6075-
(ver6, suff2), (ver3, suff3), (ver4, suff3), (ver1, suff1)]
6076-
expected = [(ver1, suff1), (ver1, suff2), (ver3, suff1), (ver3, suff3), (ver2, suff3),
6077-
(ver5, suff3), (ver4, suff1), (ver4, suff3), (ver6, suff2)]
6078-
self.assertEqual(sort_looseversions(input), expected)
6055+
"""Test sort_looseversions function."""
6056+
# Test twice: With the standard distutils LooseVersion (when available) and with our class
6057+
# Note that our class directly allows sorting but should also work with sort_loosversions
6058+
for use_distutils in (True, False):
6059+
if use_distutils:
6060+
try:
6061+
from distutils.version import LooseVersion as version_class
6062+
except ImportError:
6063+
continue
6064+
else:
6065+
version_class = LooseVersion
6066+
6067+
ver1 = version_class('1.2.3')
6068+
ver2 = version_class('4.5.6')
6069+
ver3 = version_class('1.2.3dev')
6070+
ver4 = version_class('system')
6071+
ver5 = version_class('rc3')
6072+
ver6 = version_class('v1802')
6073+
6074+
# some versions are included multiple times on purpose,
6075+
# to also test comparison between equal LooseVersion instances
6076+
input = [ver3, ver5, ver1, ver2, ver4, ver6, ver3, ver4, ver1]
6077+
expected = [ver1, ver1, ver3, ver3, ver2, ver5, ver4, ver4, ver6]
6078+
self.assertEqual(sort_looseversions(input), expected)
6079+
if not use_distutils:
6080+
self.assertEqual(sorted(input), expected)
6081+
6082+
# also test on list of tuples consisting of a LooseVersion instance + a string
6083+
# (as in the list_software_* functions)
6084+
suff1 = ''
6085+
suff2 = '-foo'
6086+
suff3 = '-bar'
6087+
input = [(ver3, suff1), (ver5, suff3), (ver1, suff2), (ver2, suff3), (ver4, suff1),
6088+
(ver6, suff2), (ver3, suff3), (ver4, suff3), (ver1, suff1)]
6089+
expected = [(ver1, suff1), (ver1, suff2), (ver3, suff1), (ver3, suff3), (ver2, suff3),
6090+
(ver5, suff3), (ver4, suff1), (ver4, suff3), (ver6, suff2)]
6091+
self.assertEqual(sort_looseversions(input), expected)
6092+
if not use_distutils:
6093+
self.assertEqual(sorted(input), expected)
60796094

60806095
def test_cuda_compute_capabilities(self):
60816096
"""Test --cuda-compute-capabilities configuration option."""

0 commit comments

Comments
 (0)