summaryrefslogtreecommitdiffstats
path: root/Lib/packaging
diff options
context:
space:
mode:
authorÉric Araujo <merwok@netwok.org>2012-02-27 10:47:44 (GMT)
committerÉric Araujo <merwok@netwok.org>2012-02-27 10:47:44 (GMT)
commit40e0f35ad54ba6b626a46ee693a2074990ae607e (patch)
tree69fd3b9849e31b4ab244299b4b8ac590efa90fc0 /Lib/packaging
parent0509d9418ab894e4ea0137206685d91a02943577 (diff)
downloadcpython-40e0f35ad54ba6b626a46ee693a2074990ae607e.zip
cpython-40e0f35ad54ba6b626a46ee693a2074990ae607e.tar.gz
cpython-40e0f35ad54ba6b626a46ee693a2074990ae607e.tar.bz2
Fix comparison bug with 'rc' versions in packaging.version (#11841).
I added some tests in 2105ab8553b7 and found no bug, but it turns out that the doctest is not actually run. While converting the doctest to unittest style, I stumbled upon this bug again and this time applied the code patch provided by Filip Gruszczyński.
Diffstat (limited to 'Lib/packaging')
-rw-r--r--Lib/packaging/tests/test_version.py9
-rw-r--r--Lib/packaging/version.py24
2 files changed, 22 insertions, 11 deletions
diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py
index c863362..2d178bf 100644
--- a/Lib/packaging/tests/test_version.py
+++ b/Lib/packaging/tests/test_version.py
@@ -16,6 +16,7 @@ class VersionTestCase(unittest.TestCase):
(V('1.2'), '1.2'),
(V('1.2.3a4'), '1.2.3a4'),
(V('1.2c4'), '1.2c4'),
+ (V('4.17rc2'), '4.17rc2'),
(V('1.2.3.4'), '1.2.3.4'),
(V('1.2.3.4.0b3'), '1.2.3.4b3'),
(V('1.2.0.0.0'), '1.2'),
@@ -146,6 +147,14 @@ class VersionTestCase(unittest.TestCase):
"""
doctest.script_from_examples(comparison_doctest_string)
+ # the doctest above is never run, so temporarily add real unit
+ # tests until the doctest is rewritten
+ self.assertLessEqual(V('1.2.0rc1'), V('1.2.0'))
+ self.assertGreater(V('1.0'), V('1.0c2'))
+ self.assertGreater(V('1.0'), V('1.0rc2'))
+ self.assertGreater(V('1.0rc2'), V('1.0rc1'))
+ self.assertGreater(V('1.0c4'), V('1.0c1'))
+
def test_suggest_normalized_version(self):
self.assertEqual(suggest('1.0'), '1.0')
diff --git a/Lib/packaging/version.py b/Lib/packaging/version.py
index 771f8d4..1970322 100644
--- a/Lib/packaging/version.py
+++ b/Lib/packaging/version.py
@@ -11,19 +11,20 @@ __all__ = ['NormalizedVersion', 'suggest_normalized_version',
# A marker used in the second and third parts of the `parts` tuple, for
# versions that don't have those segments, to sort properly. An example
# of versions in sort order ('highest' last):
-# 1.0b1 ((1,0), ('b',1), ('f',))
-# 1.0.dev345 ((1,0), ('f',), ('dev', 345))
-# 1.0 ((1,0), ('f',), ('f',))
-# 1.0.post256.dev345 ((1,0), ('f',), ('f', 'post', 256, 'dev', 345))
-# 1.0.post345 ((1,0), ('f',), ('f', 'post', 345, 'f'))
+# 1.0b1 ((1,0), ('b',1), ('z',))
+# 1.0.dev345 ((1,0), ('z',), ('dev', 345))
+# 1.0 ((1,0), ('z',), ('z',))
+# 1.0.post256.dev345 ((1,0), ('z',), ('z', 'post', 256, 'dev', 345))
+# 1.0.post345 ((1,0), ('z',), ('z', 'post', 345, 'z'))
# ^ ^ ^
-# 'b' < 'f' ---------------------/ | |
+# 'b' < 'z' ---------------------/ | |
# | |
-# 'dev' < 'f' < 'post' -------------------/ |
+# 'dev' < 'z' ----------------------------/ |
# |
-# 'dev' < 'f' ----------------------------------------------/
-# Other letters would do, but 'f' for 'final' is kind of nice.
-_FINAL_MARKER = ('f',)
+# 'dev' < 'z' ----------------------------------------------/
+# 'f' for 'final' would be kind of nice, but due to bugs in the support of
+# 'rc' we must use 'z'
+_FINAL_MARKER = ('z',)
_VERSION_RE = re.compile(r'''
^
@@ -167,8 +168,9 @@ class NormalizedVersion:
if prerel is not _FINAL_MARKER:
s += prerel[0]
s += '.'.join(str(v) for v in prerel[1:])
+ # XXX clean up: postdev is always true; code is obscure
if postdev and postdev is not _FINAL_MARKER:
- if postdev[0] == 'f':
+ if postdev[0] == _FINAL_MARKER[0]:
postdev = postdev[1:]
i = 0
while i < len(postdev):