mirror of
https://github.com/openSUSE/osc.git
synced 2024-12-25 09:26:14 +01:00
core.Package: add ordering methods, repr and hash
This commit is contained in:
parent
de10c926ea
commit
8dbf859ce2
15
osc/core.py
15
osc/core.py
@ -28,7 +28,7 @@ import sys
|
||||
import tempfile
|
||||
import textwrap
|
||||
import time
|
||||
from functools import cmp_to_key
|
||||
from functools import cmp_to_key, total_ordering
|
||||
from http.client import IncompleteRead
|
||||
from io import StringIO
|
||||
from urllib.parse import urlsplit, urlunsplit, urlparse, quote_plus, urlencode, unquote
|
||||
@ -1155,6 +1155,7 @@ class Project:
|
||||
return Project(dir, getPackageList, progress_obj, wc_check)
|
||||
|
||||
|
||||
@total_ordering
|
||||
class Package:
|
||||
"""represent a package (its directory) and read/keep/write its metadata"""
|
||||
|
||||
@ -1195,6 +1196,18 @@ class Package:
|
||||
|
||||
self.todo = []
|
||||
|
||||
def __repr__(self):
|
||||
return super().__repr__() + f"({self.prjname}/{self.name})"
|
||||
|
||||
def __hash__(self):
|
||||
return hash((self.name, self.prjname, self.apiurl))
|
||||
|
||||
def __eq__(self, other):
|
||||
return (self.name, self.prjname, self.apiurl) == (other.name, other.prjname, other.apiurl)
|
||||
|
||||
def __lt__(self, other):
|
||||
return (self.name, self.prjname, self.apiurl) < (other.name, other.prjname, other.apiurl)
|
||||
|
||||
def wc_check(self):
|
||||
dirty_files = []
|
||||
if self.scm_url:
|
||||
|
62
tests/test_core_package.py
Normal file
62
tests/test_core_package.py
Normal file
@ -0,0 +1,62 @@
|
||||
import unittest
|
||||
|
||||
import osc.core
|
||||
|
||||
|
||||
class PackageMock(osc.core.Package):
|
||||
def __init__(self, apiurl, project_name, name):
|
||||
"""
|
||||
Let's override __init__ to avoid loading from a working copy.
|
||||
"""
|
||||
self.apiurl = apiurl
|
||||
self.prjname = project_name
|
||||
self.name = name
|
||||
|
||||
|
||||
class TestPackage(unittest.TestCase):
|
||||
def test_eq(self):
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
self.assertEqual(p1, p2)
|
||||
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlA", "projA", "pkgB")
|
||||
self.assertNotEqual(p1, p2)
|
||||
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlA", "projB", "pkgA")
|
||||
self.assertNotEqual(p1, p2)
|
||||
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlB", "projA", "pkgA")
|
||||
self.assertNotEqual(p1, p2)
|
||||
|
||||
def test_lt(self):
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
self.assertFalse(p1 < p2)
|
||||
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlA", "projA", "pkgB")
|
||||
self.assertTrue(p1 < p2)
|
||||
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlA", "projB", "pkgA")
|
||||
self.assertTrue(p1 < p2)
|
||||
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlB", "projA", "pkgA")
|
||||
self.assertTrue(p1 < p2)
|
||||
|
||||
def test_hash(self):
|
||||
p1 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
p2 = PackageMock("http://urlA", "projA", "pkgA")
|
||||
packages = set()
|
||||
packages.add(p1)
|
||||
# the second instance appears to be there because it has the same hash
|
||||
# it is ok, because we consider such packages equal
|
||||
self.assertIn(p2, packages)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
Loading…
Reference in New Issue
Block a user