Created
February 4, 2013 21:03
-
-
Save vsajip/4709696 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
PEP426_VERSION_RE = re.compile('^(\d+\.\d+(\.\d+)*)((a|b|c|rc)(\d+))?' | |
'(\.(post)(\d+))?(\.(dev)(\d+))?$') | |
def pep426_key(s): | |
s = s.strip() | |
m = PEP426_VERSION_RE.match(s) | |
if not m: | |
raise ValueError('Not a valid version: %s' % s) | |
groups = m.groups() | |
nums = tuple(int(v) for v in groups[0].split('.')) | |
while len(nums) > 2 and nums[-1] == 0: | |
nums = nums[:-1] | |
pre = groups[3:5] | |
post = groups[6:8] | |
dev = groups[9:11] | |
if pre == (None, None): | |
pre = () | |
else: | |
pre = pre[0], int(pre[1]) | |
if post == (None, None): | |
post = () | |
else: | |
post = post[0], int(post[1]) | |
if dev == (None, None): | |
dev = () | |
else: | |
dev = dev[0], int(dev[1]) | |
if not pre: | |
# either before pre-release, or final release and after | |
if not post and dev: | |
# before pre-release | |
pre = ('a', -1) # to sort before a0 | |
else: | |
pre = ('z',) # to sort after all pre-releases | |
# now look at the state of post and dev. | |
if not post: | |
post = ('a',) | |
if not dev: | |
dev = ('final',) | |
return nums, pre, post, dev | |
if __name__ == '__main__': | |
import unittest | |
class PEP426VersionTestCase(unittest.TestCase): | |
def test_sorting(self): | |
versions = ( | |
'1.0.dev456', | |
'1.0a1', | |
'1.0a2.dev456', | |
'1.0a12.dev456', | |
'1.0a12', | |
'1.0b1.dev456', | |
'1.0b2', | |
'1.0b2.post345.dev456', | |
'1.0b2.post345', | |
'1.0c1.dev456', | |
'1.0c1', | |
'1.0rc1', | |
'1.0', | |
'1.0.post345.dev456', | |
'1.0.post345', | |
'1.1.dev1', | |
) | |
n = len(versions) | |
for i in range(n - 1): | |
s1 = versions[i] | |
s2 = versions[i + 1] | |
v1 = pep426_key(s1) | |
v2 = pep426_key(s2) | |
self.assertLess(v1, v2) | |
def test_equivalence(self): | |
versions = ( | |
'1.0', | |
'1.0.0', | |
'1.0.0.0', | |
) | |
n = len(versions) | |
for i in range(n - 1): | |
s1 = versions[i] | |
s2 = versions[i + 1] | |
v1 = pep426_key(s1) | |
v2 = pep426_key(s2) | |
self.assertEqual(v1, v2) | |
def test_invalid(self): | |
self.assertRaises(ValueError, pep426_key, '1') | |
self.assertRaises(ValueError, pep426_key, '') | |
self.assertRaises(ValueError, pep426_key, 'A') | |
self.assertRaises(ValueError, pep426_key, '1,0') | |
self.assertRaises(ValueError, pep426_key, '1.0.2.') | |
self.assertRaises(ValueError, pep426_key, '1.0dev1') | |
self.assertRaises(ValueError, pep426_key, '1.0post2') | |
self.assertRaises(ValueError, pep426_key, '1.0d1') | |
self.assertRaises(ValueError, pep426_key, '1.0a') | |
self.assertRaises(ValueError, pep426_key, '1.0-d1') | |
unittest.main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment