From ee7193c277513b38e8bef4de4a06f36da70fc23f Mon Sep 17 00:00:00 2001 From: Bulat Gaifullin Date: Tue, 1 Mar 2016 16:42:05 +0300 Subject: [PATCH] Made release argment of PackageVersion optional The reletion may ommit the release component of version, that means any release Aslo the strignify for PackageVersion was changed, now ':' is used to separate epoch Change-Id: I8d74c9cc82720103a5b6d9189f85276bda4ec082 --- packetary/drivers/rpm_driver.py | 2 +- packetary/objects/package_version.py | 44 ++++++++++++++++++++-------- packetary/tests/test_objects.py | 12 +++++++- packetary/tests/test_rpm_driver.py | 6 ++-- 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/packetary/drivers/rpm_driver.py b/packetary/drivers/rpm_driver.py index d98eeaa..bb4562a 100644 --- a/packetary/drivers/rpm_driver.py +++ b/packetary/drivers/rpm_driver.py @@ -393,5 +393,5 @@ class RpmRepositoryDriver(RepositoryDriverBase): return PackageVersion( attrs.get("epoch", 0), attrs.get("ver", "0.0"), - attrs.get("rel", "0") + attrs.get("rel") ) diff --git a/packetary/objects/package_version.py b/packetary/objects/package_version.py index bfd3b28..c427a67 100644 --- a/packetary/objects/package_version.py +++ b/packetary/objects/package_version.py @@ -24,10 +24,13 @@ class PackageVersion(ComparableObject): __slots__ = ["epoch", "version", "release"] - def __init__(self, epoch, version, release): + def __init__(self, epoch, version, release=None): self.epoch = int(epoch or 0) self.version = tuple(version.split('.')) - self.release = tuple(release.split('.')) + if release: + self.release = tuple(release.split('.')) + else: + self.release = None @classmethod def from_string(cls, text): @@ -35,13 +38,20 @@ class PackageVersion(ComparableObject): :param text: the version in format '[{epoch-}]-{version}-{release}' """ - components = text.split("-") - if len(components) > 2: - epoch = components[0] - components = components[1:] + pos1 = text.find(':') + if pos1 != -1: + epoch = text[0:pos1] else: epoch = 0 - return cls(epoch, components[0], components[1]) + pos1 += 1 + pos2 = text.find('-', pos1) + if pos2 != -1: + version = text[pos1: pos2] + release = text[pos2 + 1:] + else: + version = text[pos1:] + release = None + return cls(epoch, version, release) def cmp(self, other): if not isinstance(other, PackageVersion): @@ -57,7 +67,9 @@ class PackageVersion(ComparableObject): res = self._cmp_version_part(self.version, other.version) if res != 0: return res - return self._cmp_version_part(self.release, other.release) + if self.release and other.release: + return self._cmp_version_part(self.release, other.release) + return 0 def __eq__(self, other): if other is self: @@ -65,11 +77,17 @@ class PackageVersion(ComparableObject): return self.cmp(other) == 0 def __str__(self): - return "{0}-{1}-{2}".format( - self.epoch, - ".".join(str(x) for x in self.version), - ".".join(str(x) for x in self.release) - ) + if self.release: + return "{0}:{1}-{2}".format( + self.epoch, + ".".join(str(x) for x in self.version), + ".".join(str(x) for x in self.release) + ) + else: + return "{0}:{1}".format( + self.epoch, + ".".join(str(x) for x in self.version), + ) @classmethod def _order(cls, x): diff --git a/packetary/tests/test_objects.py b/packetary/tests/test_objects.py index 255fd54..3e7c1bf 100644 --- a/packetary/tests/test_objects.py +++ b/packetary/tests/test_objects.py @@ -224,16 +224,26 @@ class TestPackageVersion(base.TestCase): self.assertEqual(('1', '0'), ver.version) self.assertEqual(('22',), ver.release) - ver2 = PackageVersion.from_string("1-11.0-2") + ver2 = PackageVersion.from_string("1:11.0-2") self.assertEqual(1, ver2.epoch) self.assertEqual(('11', '0'), ver2.version) self.assertEqual(('2',), ver2.release) + ver3 = PackageVersion.from_string("11.0") + self.assertEqual(0, ver3.epoch) + self.assertEqual(('11', '0'), ver3.version) + self.assertIsNone(ver3.release) + def test_compare(self): ver1 = PackageVersion.from_string("6.3-31.5") ver2 = PackageVersion.from_string("13.9-16.12") + ver3 = PackageVersion.from_string("13.9") + ver4 = PackageVersion.from_string("1:13.9") self.assertLess(ver1, ver2) self.assertGreater(ver2, ver1) self.assertEqual(ver1, ver1) self.assertLess(ver1, "6.3-40") self.assertGreater(ver1, "6.3-31.4a") + self.assertEqual(ver2, ver3) + self.assertGreater(ver4, ver3) + self.assertGreater(ver4, ver2) diff --git a/packetary/tests/test_rpm_driver.py b/packetary/tests/test_rpm_driver.py index e1d42d3..30bb2a6 100644 --- a/packetary/tests/test_rpm_driver.py +++ b/packetary/tests/test_rpm_driver.py @@ -141,7 +141,7 @@ class TestRpmDriver(base.TestCase): "Packages/test1.rpm", package.filename ) self.assertItemsEqual( - ['test2 (= 0-1.1.1.1-1.el7)'], + ['test2 (= 0:1.1.1.1-1.el7)'], (str(x) for x in package.requires) ) self.assertItemsEqual( @@ -379,13 +379,13 @@ class TestRpmDriver(base.TestCase): ) self.assertEqual("Test", pkg.name) - self.assertEqual("1-1.2.3-1", str(pkg.version)) + self.assertEqual("1:1.2.3-1", str(pkg.version)) self.assertEqual("test.rpm", pkg.filename) self.assertEqual((3, 4, 5), pkg.checksum) self.assertEqual("Group", pkg.group) self.assertEqual(10, pkg.filesize) self.assertItemsEqual( - ['test1 (= 0-1.2.3-1.el5)'], + ['test1 (= 0:1.2.3-1.el5)'], (str(x) for x in pkg.requires) ) self.assertItemsEqual(