Skip to content

Instantly share code, notes, and snippets.

@vsajip
Created February 4, 2013 21:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vsajip/4709696 to your computer and use it in GitHub Desktop.
Save vsajip/4709696 to your computer and use it in GitHub Desktop.
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