[Python-checkins] cpython: Fix comparison bug with 'rc' versions in packaging.version (#11841).

eric.araujo python-checkins at python.org
Mon Feb 27 11:47:50 CET 2012


http://hg.python.org/cpython/rev/32cb52bee738
changeset:   75308:32cb52bee738
user:        Éric Araujo <merwok at netwok.org>
date:        Mon Feb 27 11:47:44 2012 +0100
summary:
  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.

files:
  Lib/packaging/tests/test_version.py |   9 ++++++
  Lib/packaging/version.py            |  24 +++++++++-------
  Misc/NEWS                           |   3 ++
  3 files changed, 25 insertions(+), 11 deletions(-)


diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py
--- a/Lib/packaging/tests/test_version.py
+++ b/Lib/packaging/tests/test_version.py
@@ -16,6 +16,7 @@
                 (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 @@
         """
         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
--- a/Lib/packaging/version.py
+++ b/Lib/packaging/version.py
@@ -11,19 +11,20 @@
 # 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 @@
         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):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -508,6 +508,9 @@
 Library
 -------
 
+- Issue #11841: Fix comparison bug with 'rc' versions in packaging.version.
+  Patch by Filip Gruszczyński.
+
 - Issue #13447: Add a test file to host regression tests for bugs in the
   scripts found in the Tools directory.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list