Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2013-07-28 21:26:07 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2013-07-28 21:26:07 (GMT)
commit48c396af4d9c6bdea03db81968cae8c32934f31a (patch)
tree48bc1811f14bf88ad8f8d0f5ef2bad9c5956893e
parent639b4403cab54eb10308c7ae24aa3d72ce8b47db (diff)
Exception-less mode for toolkit.parse_version()
-rw-r--r--sugar_network/toolkit/spec.py29
-rwxr-xr-xtests/units/toolkit/spec.py5
2 files changed, 26 insertions, 8 deletions
diff --git a/sugar_network/toolkit/spec.py b/sugar_network/toolkit/spec.py
index d51abe9..9dec4b8 100644
--- a/sugar_network/toolkit/spec.py
+++ b/sugar_network/toolkit/spec.py
@@ -60,7 +60,7 @@ _VERSION_VALUE_TO_MOD = {}
_logger = logging.getLogger('sweets-recipe')
-def parse_version(version_string):
+def parse_version(version_string, ignore_errors=False):
"""Convert a version string to an internal representation.
The parsed format can be compared quickly using the standard Python
@@ -75,24 +75,35 @@ def parse_version(version_string):
if version_string is None:
return None
- parts = _VERSION_RE.split(version_string)
+ parts = _VERSION_RE.split(version_string.lower())
if parts[-1] == '':
del parts[-1] # Ends with a modifier
else:
parts.append('')
enforce(parts, ValueError, 'Empty version string')
+ def to_int(x):
+ pos = 0
+ for i in x:
+ if not i.isdigit():
+ enforce(ignore_errors, ValueError,
+ 'Only numbers are allowed in version category')
+ break
+ pos += 1
+ if pos:
+ return int(x[:pos])
+ else:
+ enforce(ignore_errors, ValueError, 'Empty version category')
+ return 0
+
length = len(parts)
try:
for x in range(0, length, 2):
part = parts[x]
if part:
- parts[x] = [int(i) for i in part.split('.')]
+ parts[x] = [to_int(i) for i in part.split('.')]
else:
parts[x] = [] # (because ''.split('.') == [''], not [])
- for x in range(1, length, 2):
- parts[x] = _VERSION_MOD_TO_VALUE[parts[x]]
- return parts
except ValueError as error:
exception()
raise ValueError('Invalid version format in "%s": %s' %
@@ -101,6 +112,10 @@ def parse_version(version_string):
raise ValueError('Invalid version modifier in "%s": %s' %
(version_string, error))
+ for x in range(1, length, 2):
+ parts[x] = _VERSION_MOD_TO_VALUE[parts[x]]
+ return parts
+
def format_version(version):
"""Convert version to string representation.
@@ -201,7 +216,7 @@ def ensure_requires(to_consider, to_apply):
def intersect(x, y):
l = max([parse_version(i) for i, __ in (x + y)])
- r = min([[[sys.maxint]] if i is None else parse_version(i) \
+ r = min([[[sys.maxint]] if i is None else parse_version(i)
for __, i in (x + y)])
return l is None or r is None or l < r
diff --git a/tests/units/toolkit/spec.py b/tests/units/toolkit/spec.py
index e34b6ec..f4f8279 100755
--- a/tests/units/toolkit/spec.py
+++ b/tests/units/toolkit/spec.py
@@ -128,7 +128,7 @@ class SpecTest(tests.Test):
},
recipe.requires)
- def testVersions(self):
+ def test_parse_version(self):
def pv(v):
parsed = spec.parse_version(v)
@@ -176,6 +176,9 @@ class SpecTest(tests.Test):
assert pv('2-r999') < pv('3-pre1')
+ def test_parse_version_IgnoreErrors(self):
+ self.assertEqual([[1, 2], 0], spec.parse_version('1.2foo', ignore_errors=True))
+
def test_ensure_requires(self):
assert spec.ensure_requires(spec.parse_requires(''), spec.parse_requires(''))