diff --git a/semver.py b/semver.py index d234f26a..ec764946 100644 --- a/semver.py +++ b/semver.py @@ -99,11 +99,11 @@ class VersionInfo(object): __slots__ = ('_major', '_minor', '_patch', '_prerelease', '_build') def __init__(self, major, minor=0, patch=0, prerelease=None, build=None): - self._major = major - self._minor = minor - self._patch = patch - self._prerelease = prerelease - self._build = build + self._major = int(major) + self._minor = int(minor) + self._patch = int(patch) + self._prerelease = None if prerelease is None else str(prerelease) + self._build = None if build is None else str(build) @property def major(self): diff --git a/test_semver.py b/test_semver.py index 96b78967..a9b1061e 100644 --- a/test_semver.py +++ b/test_semver.py @@ -497,3 +497,37 @@ def test_immutable_unknown_attribute(version): def test_version_info_should_be_iterable(version): assert tuple(version) == (version.major, version.minor, version.patch, version.prerelease, version.build) + + +def test_should_compare_prerelease_and_build_with_numbers(): + assert VersionInfo(major=1, minor=9, patch=1, prerelease=1, build=1) < \ + VersionInfo(major=1, minor=9, patch=1, prerelease=2, build=1) + assert VersionInfo(1, 9, 1, 1, 1) < VersionInfo(1, 9, 1, 2, 1) + assert VersionInfo('2') < VersionInfo(10) + assert VersionInfo('2') < VersionInfo('10') + + +def test_should_be_able_to_use_strings_as_major_minor_patch(): + v = VersionInfo('1', '2', '3') + assert isinstance(v.major, int) + assert isinstance(v.minor, int) + assert isinstance(v.patch, int) + assert v.prerelease is None + assert v.build is None + assert VersionInfo('1', '2', '3') == VersionInfo(1, 2, 3) + + +def test_using_non_numeric_string_as_major_minor_patch_throws(): + with pytest.raises(ValueError): + VersionInfo('a') + with pytest.raises(ValueError): + VersionInfo(1, 'a') + with pytest.raises(ValueError): + VersionInfo(1, 2, 'a') + + +def test_should_be_able_to_use_integers_as_prerelease_build(): + v = VersionInfo(1, 2, 3, 4, 5) + assert isinstance(v.prerelease, str) + assert isinstance(v.build, str) + assert VersionInfo(1, 2, 3, 4, 5) == VersionInfo(1, 2, 3, '4', '5')