Handle more legacy version numbers

We were not handling 1.2.1a1 or 2.1.0.rc1.

Change-Id: I087ff6f0449d528ee86b8e16721d12fd9b231846
Closes-Bug: #1361251
This commit is contained in:
Robert Collins 2014-08-26 15:46:16 +12:00 committed by lifeless
parent 81c2000881
commit 85ba9600b2
2 changed files with 45 additions and 2 deletions

View File

@ -107,6 +107,31 @@ class TestSemanticVersion(base.BaseTestCase):
parsed = from_pip_string('1.2.0rc1')
self.assertEqual(expected, parsed)
def test_from_pip_string_legacy_nonzero_lead_in(self):
# reported in bug 1361251
expected = version.SemanticVersion(
0, 0, 1, prerelease_type='a', prerelease=2)
parsed = from_pip_string('0.0.1a2')
self.assertEqual(expected, parsed)
def test_from_pip_string_legacy_short_nonzero_lead_in(self):
expected = version.SemanticVersion(
0, 1, 0, prerelease_type='a', prerelease=2)
parsed = from_pip_string('0.1a2')
self.assertEqual(expected, parsed)
def test_from_pip_string_legacy_no_0_prerelease(self):
expected = version.SemanticVersion(
2, 1, 0, prerelease_type='rc', prerelease=1)
parsed = from_pip_string('2.1.0.rc1')
self.assertEqual(expected, parsed)
def test_from_pip_string_legacy_no_0_prerelease_2(self):
expected = version.SemanticVersion(
2, 0, 0, prerelease_type='rc', prerelease=1)
parsed = from_pip_string('2.0.0.rc1')
self.assertEqual(expected, parsed)
def test_from_pip_string_legacy_non_440_beta(self):
expected = version.SemanticVersion(
2014, 2, prerelease_type='b', prerelease=2)
@ -153,6 +178,12 @@ class TestSemanticVersion(base.BaseTestCase):
self.assertEqual("1.2.3", semver.rpm_string())
self.assertEqual(semver, from_pip_string("1.2.3"))
def test_parsing_short_forms(self):
semver = version.SemanticVersion(1, 0, 0)
self.assertEqual(semver, from_pip_string("1"))
self.assertEqual(semver, from_pip_string("1.0"))
self.assertEqual(semver, from_pip_string("1.0.0"))
def test_dev_version(self):
semver = version.SemanticVersion(1, 2, 4, dev_count=5, githash='12')
self.assertEqual((1, 2, 4, 'dev', 4), semver.version_tuple())

View File

@ -169,6 +169,16 @@ class SemanticVersion(object):
if digit_len == 0:
raise ValueError("Invalid version %r" % version_string)
elif digit_len < 3:
if (digit_len < len(input_components) and
input_components[digit_len][0].isdigit()):
# Handle X.YaZ - Y is a digit not a leadin to pre-release.
mixed_component = input_components[digit_len]
last_component = ''.join(itertools.takewhile(
lambda x: x.isdigit(), mixed_component))
components.append(last_component)
input_components[digit_len:digit_len + 1] = [
last_component, mixed_component[len(last_component):]]
digit_len += 1
components.extend([0] * (3 - digit_len))
components.extend(input_components[digit_len:])
major = int(components[0])
@ -205,7 +215,7 @@ class SemanticVersion(object):
dev_count = int(remainder[0])
else:
if remainder and (remainder[0][0] == '0' or
remainder[0][0] in ('a', 'b', 'rc')):
remainder[0][0] in ('a', 'b', 'r')):
# Current RC/beta layout
prerelease_type, prerelease = _parse_type(remainder[0])
remainder = remainder[1:]
@ -218,7 +228,9 @@ class SemanticVersion(object):
dev_count = 1
githash = component[1:]
else:
raise ValueError('Unknown remainder %r' % (remainder,))
raise ValueError(
'Unknown remainder %r in %r'
% (remainder, version_string))
if len(remainder) > 1:
githash = remainder[1][1:]
return SemanticVersion(