From bd808ed05c907a472d02cc54a1bcb7c7a8aef28a Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Jun 29 2016 11:35:21 +0000 Subject: [PATCH 1/3] first step to add filters to metadata --- diff --git a/modulemd/__init__.py b/modulemd/__init__.py index 331ea39..3b75543 100644 --- a/modulemd/__init__.py +++ b/modulemd/__init__.py @@ -145,6 +145,11 @@ class ModuleMetadata(object): if "multilib" in e: extras["multilib"] = e["multilib"] self.components.rpms.add_package(p, **extras) + if "filter" in yml["data"]["components"]["rpms"]: + self.components.rpms.filter = \ + yml["data"]["components"]["rpms"]["filter"] + else: + self.components.rpms.filter = [] def dump(self, f): """Dumps the metadata into the supplied file. @@ -226,6 +231,11 @@ class ModuleMetadata(object): extra["multilib"] = e["multilib"] data["data"]["components"]["rpms"]["packages"][p] = \ extra + if self.components.rpms.filter: + data["data"]["components"]["rpms"]["filter"] = \ + self.components.rpms.filter +#KH XXX is this list correct ? +# list(self.components.rpms.filter) return yaml.dump(data) def validate(self): @@ -299,6 +309,8 @@ class ModuleMetadata(object): for a in self.components.rpms.api: if not isinstance(a, str): raise TypeError("rpms.api must be a set of strings") + if not isinstance(self.components.rpms.filter, list): + raise TypeError("rpms.filter must be a list") if self.components.rpms.packages: if not isinstance(self.components.rpms.packages, dict): raise TypeError("rpms.packages must be a dictionary") diff --git a/modulemd/rpms.py b/modulemd/rpms.py index a7ffa52..45912b8 100644 --- a/modulemd/rpms.py +++ b/modulemd/rpms.py @@ -34,6 +34,7 @@ class ModuleRPMs(ModuleContent): self._dependencies = False self._api = set() self._packages = dict() + self._filter = list() def add_package(self, p, rationale="", commit=None, repository=None, cache=None, arches=None, multilib=None): """Adds a package to the package list. @@ -91,6 +92,39 @@ class ModuleRPMs(ModuleContent): self._dependencies = bool(b) @property + def filter(self): + """A list of binary package names to be filtered out + """ + return self._filter + + @filter.setter + def filter(self, s): +# raise TypeError("KH 1: ", s) + if not isinstance(s, list): + raise TypeError("filter requires a list") + self._filter = s + + def add_filter(self, s): + """Adds a string to the list of filters + + :param str s: RPM binary package name + """ + self._filter.add(str(s)) + + update_filter = add_filter + + def del_filter(self, s): + """Remove the supplied binary package name from the list of filters. + + :param str s: RPM binary package name + """ + self._filter.remove(str(s)) + + def clear_filter(self): + """Clears the RPM package name filter list.""" + self._filter[:] = [] + + @property def api(self): """A set of RPM binary package names representing the external, supported API of the module. diff --git a/tests/test.yaml b/tests/test.yaml index 98b9367..783379e 100644 --- a/tests/test.yaml +++ b/tests/test.yaml @@ -38,6 +38,8 @@ data: api: - alfa - alfa-extras + filter: + - glibc packages: alfa: rationale: alfa rationale From c8c4aa70dfcaa89a143907ac5033e617f98c8575 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Jun 30 2016 09:02:00 +0000 Subject: [PATCH 2/3] remove obsolete coment --- diff --git a/modulemd/__init__.py b/modulemd/__init__.py index 3b75543..379c45b 100644 --- a/modulemd/__init__.py +++ b/modulemd/__init__.py @@ -234,8 +234,6 @@ class ModuleMetadata(object): if self.components.rpms.filter: data["data"]["components"]["rpms"]["filter"] = \ self.components.rpms.filter -#KH XXX is this list correct ? -# list(self.components.rpms.filter) return yaml.dump(data) def validate(self): From d560e0890fb20ba72f5593193d499daa8af84ffc Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Jun 30 2016 11:42:27 +0000 Subject: [PATCH 3/3] add unit tests, use set instead of list --- diff --git a/modulemd/__init__.py b/modulemd/__init__.py index 379c45b..65e40f9 100644 --- a/modulemd/__init__.py +++ b/modulemd/__init__.py @@ -147,9 +147,9 @@ class ModuleMetadata(object): self.components.rpms.add_package(p, **extras) if "filter" in yml["data"]["components"]["rpms"]: self.components.rpms.filter = \ - yml["data"]["components"]["rpms"]["filter"] + set(yml["data"]["components"]["rpms"]["filter"]) else: - self.components.rpms.filter = [] + self.components.rpms.filter = set() def dump(self, f): """Dumps the metadata into the supplied file. @@ -233,7 +233,7 @@ class ModuleMetadata(object): extra if self.components.rpms.filter: data["data"]["components"]["rpms"]["filter"] = \ - self.components.rpms.filter + list(self.components.rpms.filter) return yaml.dump(data) def validate(self): @@ -307,8 +307,11 @@ class ModuleMetadata(object): for a in self.components.rpms.api: if not isinstance(a, str): raise TypeError("rpms.api must be a set of strings") - if not isinstance(self.components.rpms.filter, list): - raise TypeError("rpms.filter must be a list") + if not isinstance(self.components.rpms.filter, set): + raise TypeError("rpms.filter must be a set") + for a in self.components.rpms.filter: + if not isinstance(a, str): + raise TypeError("rpms.filter must be a set of strings") if self.components.rpms.packages: if not isinstance(self.components.rpms.packages, dict): raise TypeError("rpms.packages must be a dictionary") diff --git a/modulemd/rpms.py b/modulemd/rpms.py index 45912b8..438f88d 100644 --- a/modulemd/rpms.py +++ b/modulemd/rpms.py @@ -34,7 +34,7 @@ class ModuleRPMs(ModuleContent): self._dependencies = False self._api = set() self._packages = dict() - self._filter = list() + self._filter = set() def add_package(self, p, rationale="", commit=None, repository=None, cache=None, arches=None, multilib=None): """Adds a package to the package list. @@ -98,14 +98,13 @@ class ModuleRPMs(ModuleContent): return self._filter @filter.setter - def filter(self, s): -# raise TypeError("KH 1: ", s) - if not isinstance(s, list): - raise TypeError("filter requires a list") - self._filter = s + def filter(self, ss): + if not isinstance(ss, set): + raise TypeError("filter requires a set") + self._filter = ss def add_filter(self, s): - """Adds a string to the list of filters + """Adds a string to the set of filters :param str s: RPM binary package name """ @@ -114,15 +113,15 @@ class ModuleRPMs(ModuleContent): update_filter = add_filter def del_filter(self, s): - """Remove the supplied binary package name from the list of filters. + """Remove the supplied binary package name from the set of filters. :param str s: RPM binary package name """ - self._filter.remove(str(s)) + self._filter.discard(str(s)) def clear_filter(self): - """Clears the RPM package name filter list.""" - self._filter[:] = [] + """Clears the RPM package name filter set.""" + self._filter.clear() @property def api(self): diff --git a/tests/test.yaml b/tests/test.yaml index 783379e..80b5a54 100644 --- a/tests/test.yaml +++ b/tests/test.yaml @@ -39,7 +39,8 @@ data: - alfa - alfa-extras filter: - - glibc + - filter_1 + - filter_2 packages: alfa: rationale: alfa rationale diff --git a/tests/test_basic.py b/tests/test_basic.py index 4dfeaf9..d6ceb29 100755 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -58,6 +58,7 @@ class TestBasic(unittest.TestCase): cls.mmd.components.rpms.dependencies = True cls.mmd.components.rpms.api = set([ "api" ]) cls.mmd.components.rpms.packages = { "rpm" : { "rationale" : "" } } + cls.mmd.components.rpms.filter = set([ "filter_1", "filter_2" ]) def test_mdversion(self): self.assertIn(self.mmd.mdversion, modulemd.supported_mdversions) @@ -122,5 +123,8 @@ class TestBasic(unittest.TestCase): def test_rpm_packages(self): self.assertEqual(self.mmd.components.rpms.packages, { "rpm" : { "rationale" : "" } }) + def test_rpm_filter(self): + self.assertEqual(self.mmd.components.rpms.filter, set([ "filter_1", "filter_2" ])) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_io.py b/tests/test_io.py index 4a43cf3..8145c39 100755 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -66,6 +66,8 @@ class TestIO(unittest.TestCase): "commit" : "foxtrot", "repository" : "golf", "cache" : "hotel" } } ) + self.assertEqual(mmd.components.rpms.filter, + set([ "filter_1", "filter_2" ])) def test_loads(self, yaml=None): mmd = modulemd.ModuleMetadata() @@ -115,6 +117,9 @@ class TestIO(unittest.TestCase): commit: foxtrot repository: golf cache: hotel + filter: + - filter_1 + - filter_2 """ if not yaml: yaml = document @@ -147,6 +152,8 @@ class TestIO(unittest.TestCase): "commit" : "foxtrot", "repository" : "golf", "cache" : "hotel" } } ) + self.assertEqual(mmd.components.rpms.filter, + set([ "filter_1", "filter_2" ])) def test_dump(self): mmd = modulemd.ModuleMetadata() @@ -177,6 +184,8 @@ class TestIO(unittest.TestCase): mmd.components.rpms.add_package("bravo", rationale="bravo rationale", arches=["charlie", "delta"], multilib=["echo"], commit="foxtrot", repository="golf", cache="hotel") + mmd.components.rpms.add_filter("filter_1") + mmd.components.rpms.add_filter("filter_2") mmd.dump("tests/dump.yaml") self.test_load(filename="tests/dump.yaml") @@ -209,6 +218,8 @@ class TestIO(unittest.TestCase): mmd.components.rpms.add_package("bravo", rationale="bravo rationale", arches=["charlie", "delta"], multilib=["echo"], commit="foxtrot", repository="golf", cache="hotel") + mmd.components.rpms.add_filter("filter_1") + mmd.components.rpms.add_filter("filter_2") self.test_loads(yaml=mmd.dumps()) if __name__ == "__main__": diff --git a/tests/test_rpms.py b/tests/test_rpms.py index be1df46..6801194 100755 --- a/tests/test_rpms.py +++ b/tests/test_rpms.py @@ -115,5 +115,20 @@ class TestRPMs(unittest.TestCase): self.mr.clear_api() self.assertEqual(self.mr.api, set([])) + def test_add_filter(self): + self.assertNotIn("AddRPMAPI", self.mr.filter) + self.mr.add_filter("AddRPMAPI") + self.assertIn("AddRPMAPI", self.mr.filter) + + def test_del_filter(self): + self.mr.filter = set(["DelRPMAPI"]) + self.mr.del_filter("DelRPMAPI") + self.assertNotIn("DelRPMAPI", self.mr.filter) + + def test_clear_filter(self): + self.mr.filter = set(["ClearRPMAPI"]) + self.mr.clear_filter() + self.assertEqual(self.mr.filter, set([])) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_validate.py b/tests/test_validate.py index 6431340..64e03ca 100755 --- a/tests/test_validate.py +++ b/tests/test_validate.py @@ -217,5 +217,45 @@ class TestValidate(unittest.TestCase): self.mmd.components.rpms._packages = { "foo" : { "rationale" : "", "cache" : 1 } } self.assertRaises(TypeError, self.mmd.validate) + def test_validate_rpms_api1(self): + self.mmd.components.rpms._api = None + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_api2(self): + self.mmd.components.rpms._api = 42 + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_api3(self): + self.mmd.components.rpms._api = "foo" + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_api4(self): + self.mmd.components.rpms._api = [ "foo", "bar" ] + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_api5(self): + self.mmd.components.rpms._api = { "foo", 1 } + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_filter1(self): + self.mmd.components.rpms._filter = None + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_filter2(self): + self.mmd.components.rpms._filter = 42 + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_filter3(self): + self.mmd.components.rpms._filter = "foo" + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_filter4(self): + self.mmd.components.rpms._filter = [ "foo", "bar" ] + self.assertRaises(TypeError, self.mmd.validate) + + def test_validate_rpms_filter5(self): + self.mmd.components.rpms._filter = { "foo", 1 } + self.assertRaises(TypeError, self.mmd.validate) + if __name__ == "__main__": unittest.main()