diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2013-07-28 21:26:07 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2013-07-28 21:26:07 (GMT) |
commit | 48c396af4d9c6bdea03db81968cae8c32934f31a (patch) | |
tree | 48bc1811f14bf88ad8f8d0f5ef2bad9c5956893e | |
parent | 639b4403cab54eb10308c7ae24aa3d72ce8b47db (diff) |
Exception-less mode for toolkit.parse_version()
-rw-r--r-- | sugar_network/toolkit/spec.py | 29 | ||||
-rwxr-xr-x | tests/units/toolkit/spec.py | 5 |
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('')) |