[ab])?(?:-pre)?(?P\d+)?"
## r"(?:\.dev-r(?P\d+))?$")
VERSION_RE = re.compile(r"(?P\d+)\.(?P\d+)\.(?P\d+)(?P[ab])?"
r"(?:-pre)?(?P\d+)?"
r"(?:\.dev-r(?P\d+))?$")
def parse_version(text):
"""
>>> parse_version("0.0.1")
('0', '0', '1', None, None, None)
>>> parse_version("0.2.3b")
('0', '2', '3', 'b', None, None)
>>> parse_version("1.0.3a")
('1', '0', '3', 'a', None, None)
>>> parse_version("123.012.304a")
('123', '012', '304', 'a', None, None)
>>> parse_version("1.0.3c")
Traceback (most recent call last):
ValueError
>>> parse_version("1.0.3a-pre1")
('1', '0', '3', 'a', '1', None)
>>> parse_version("1.0.3a-pre234")
('1', '0', '3', 'a', '234', None)
>>> parse_version("0.0.11a.dev-r20458")
('0', '0', '11', 'a', None, '20458')
>>> parse_version("1.0.3a-preblah")
Traceback (most recent call last):
ValueError
"""
m = VERSION_RE.match(text)
#print 'text', text
if m is None:
raise ValueError
return tuple([m.groupdict()[part] for part in
("major", "minor", "bugfix", "state", "pre", "svn")])
def unparse_version(tup):
"""
>>> unparse_version(('0', '0', '1', None, None, None))
'0.0.1'
>>> unparse_version(('0', '2', '3', 'b', None, None))
'0.2.3b'
>>> unparse_version()
Traceback (most recent call last):
File "", line 1, in ?
TypeError: unparse_version() takes exactly 1 argument (0 given)
>>> unparse_version(('1', '0', '3', 'a', None, None))
'1.0.3a'
>>> unparse_version(('123', '012', '304', 'a', None, None))
'123.012.304a'
>>> unparse_version(('1', '0', '3', 'a', '1', None))
'1.0.3a-pre1'
>>> unparse_version(('1', '0', '3', 'a', '234', None))
'1.0.3a-pre234'
"""
major, minor, bugfix, state_char, pre, svn = tup
fmt = "%s.%s.%s"
args = [major, minor, bugfix]
if state_char is not None:
fmt += "%s"
args.append(state_char)
if pre is not None:
fmt += "-pre%s"
args.append(pre)
if svn is not None:
fmt += ".dev-r%s"
args.append(svn)
return fmt % tuple(args)
def win_version(text):
"""
>>> win_version("0.0.1")
'0_0_1'
>>> win_version("11.03.12a")
'11_03_12a'
>>> win_version("11.03.12a-pre23")
'11_03_12a-pre23'
>>> win_version("11.03.12a.dev-r12345")
'11_03_12a.dev-r12345'
"""
major, minor, bugfix, state_char, pre, svn = parse_version(text)
if bugfix is None: bugfix = ""
if state_char is None: state_char = ""
if pre is None:
pre = ""
else:
pre = "-pre%s" % pre
if svn is None:
svn = ""
else:
svn = ".dev-r%s" % svn
return "%s_%s_%s%s%s%s" % (major, minor, bugfix, state_char, pre, svn)
# auto_chmod / rmtree pinched from Phillip Eby's setuptools
def auto_chmod(func, arg, exc):
if func is os.remove and os.name=='nt':
os.chmod(arg, stat.S_IWRITE)
return func(arg)
exc = sys.exc_info()
raise exc[0], (exc[1][0], exc[1][1] + (" %s %s" % (func,arg)))
def rmtree(path, ignore_errors=False, onerror=auto_chmod, pretend=False,
depth=0):
"""Recursively delete a directory tree.
This code is taken from the Python 2.4 version of 'shutil', because
the 2.3 version doesn't really work right.
"""
if not depth:
print "recursively removing", path
if pretend:
return
if ignore_errors:
def onerror(*args):
pass
elif onerror is None:
def onerror(*args):
raise
names = []
try:
names = os.listdir(path)
except os.error, err:
onerror(os.listdir, path, sys.exc_info())
for name in names:
fullname = os.path.join(path, name)
try:
mode = os.lstat(fullname).st_mode
except os.error:
mode = 0
if stat.S_ISDIR(mode):
rmtree(fullname, ignore_errors, onerror, pretend, depth+1)
else:
try:
os.remove(fullname)
except os.error, err:
onerror(os.remove, fullname, sys.exc_info())
try:
os.rmdir(path)
except os.error:
onerror(os.rmdir, path, sys.exc_info())
def _test():
import doctest
return doctest.testmod()
if __name__ == "__main__":
_test()