From bf67449e8385e1fb0e4e68ef546eb1daec3d3c80 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 11 May 2022 09:54:31 -0400 Subject: [PATCH 1/3] TEST: Check compatibility of vendored LooseVersion with distutils version --- nipype/external/tests/test_version.py | 33 +++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 nipype/external/tests/test_version.py diff --git a/nipype/external/tests/test_version.py b/nipype/external/tests/test_version.py new file mode 100644 index 0000000000..24fa2e0321 --- /dev/null +++ b/nipype/external/tests/test_version.py @@ -0,0 +1,33 @@ +import warnings + +import pytest + +from nipype.external.version import LooseVersion as Vendored + +with warnings.catch_warnings(): + warnings.simplefilter("ignore") + try: + from distutils.version import LooseVersion as Original + except ImportError: + pytest.skip() + + +@pytest.mark.parametrize("v1, v2", [("0.0.0", "0.0.0"), ("0.0.0", "1.0.0")]) +def test_LooseVersion_compat(v1, v2): + vend1, vend2 = Vendored(v1), Vendored(v2) + orig1, orig2 = Original(v1), Original(v2) + + assert vend1 == orig1 + assert orig1 == vend1 + assert vend2 == orig2 + assert orig2 == vend2 + assert (vend1 == orig2) == (v1 == v2) + assert (vend1 < orig2) == (v1 < v2) + assert (vend1 > orig2) == (v1 > v2) + assert (vend1 <= orig2) == (v1 <= v2) + assert (vend1 >= orig2) == (v1 >= v2) + assert (orig1 == vend2) == (v1 == v2) + assert (orig1 < vend2) == (v1 < v2) + assert (orig1 > vend2) == (v1 > v2) + assert (orig1 <= vend2) == (v1 <= v2) + assert (orig1 >= vend2) == (v1 >= v2) From aa99263caa2b2eac097c1437ec62f3bb0cc7bb0d Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 11 May 2022 10:35:23 -0400 Subject: [PATCH 2/3] FIX: Make vendored LooseVersion comparable to distutils.version.LooseVersion --- nipype/external/version.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/nipype/external/version.py b/nipype/external/version.py index 0a2fbf167e..141443da96 100644 --- a/nipype/external/version.py +++ b/nipype/external/version.py @@ -12,6 +12,8 @@ # 2022.04.27 - Minor changes are made to the comments, # - The StrictVersion class was removed # - Black styling was applied +# 2022.05.11 - Refactor LooseVersion._cmp to permit comparisons with +# distutils.version.LooseVersion # # distutils/version.py @@ -38,6 +40,7 @@ of the same class, thus must follow the same rules) """ +import sys import re @@ -211,10 +214,7 @@ def __repr__(self): return "LooseVersion ('%s')" % str(self) def _cmp(self, other): - if isinstance(other, str): - other = LooseVersion(other) - elif not isinstance(other, LooseVersion): - return NotImplemented + other = self._coerce(other) if self.version == other.version: return 0 @@ -222,3 +222,19 @@ def _cmp(self, other): return -1 if self.version > other.version: return 1 + + @staticmethod + def _coerce(other): + if isinstance(other, LooseVersion): + return other + elif isinstance(other, str): + return LooseVersion(other) + elif "distutils" in sys.modules: + # Using this check to avoid importing distutils and suppressing the warning + try: + from distutils.version import LooseVersion as deprecated + except ImportError: + return NotImplemented + if isinstance(other, deprecated): + return LooseVersion(str(other)) + return NotImplemented From f0fb21d6a871d44236ba4cd7e1dbedb28569e4b7 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 11 May 2022 12:57:38 -0400 Subject: [PATCH 3/3] TEST: Catch warnings... apparently they double dip --- nipype/external/tests/test_version.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nipype/external/tests/test_version.py b/nipype/external/tests/test_version.py index 24fa2e0321..3c24475d94 100644 --- a/nipype/external/tests/test_version.py +++ b/nipype/external/tests/test_version.py @@ -15,7 +15,9 @@ @pytest.mark.parametrize("v1, v2", [("0.0.0", "0.0.0"), ("0.0.0", "1.0.0")]) def test_LooseVersion_compat(v1, v2): vend1, vend2 = Vendored(v1), Vendored(v2) - orig1, orig2 = Original(v1), Original(v2) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + orig1, orig2 = Original(v1), Original(v2) assert vend1 == orig1 assert orig1 == vend1