From 019cf2ecb104ba7ede5e1c0bd6612546bf5488b5 Mon Sep 17 00:00:00 2001 From: Eric Torres Date: Mon, 25 Mar 2019 21:53:27 -0700 Subject: [PATCH] Add ability to filter through iterables, pkgfile.filter(), and tests --- packaging_scripts/pkgfiles.py | 36 ++++++++++++++++++++++------------- tests/test_pkgfiles.py | 24 ++++++++++++++++++++--- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/packaging_scripts/pkgfiles.py b/packaging_scripts/pkgfiles.py index fa160c7..bf3c05b 100644 --- a/packaging_scripts/pkgfiles.py +++ b/packaging_scripts/pkgfiles.py @@ -19,7 +19,7 @@ syslog = logging.getLogger(__name__) # ========== Functions ========== def get(query=None, *, directory=None, signatures_only=False): - """Return a list of package files in the current working directory. + """Retrieve all package-related files from the filesystem. :param query: names of package files to search for :type query: str @@ -33,9 +33,22 @@ def get(query=None, *, directory=None, signatures_only=False): filequery = f"*{query}*" if query else "*" if signatures_only: - yield from _filter_by_regex(filequery, SIGREGEX, path) + yield from _filter_by_regex(SIGREGEX, path.glob(filequery)) else: - yield from _filter_by_regex(filequery, PKGREGEX, path) + yield from _filter_by_regex(PKGREGEX, path.glob(filequery)) + + +def filter(iterable, *, signatures_only=False): + """Retrive package file types from a predefined iterable. + + :param signatures_only: include only signature files + :type signatures_only: bool + :yields: paths of package files + """ + if signatures_only: + yield from _filter_by_regex(SIGREGEX, iterable) + else: + yield from _filter_by_regex(PKGREGEX, iterable) def add(pkgfile, cachedir): @@ -60,18 +73,15 @@ def delete(pkg): syslog.info(f"Removed {pkg}") -def _filter_by_regex(query, regex_expression, path): +def _filter_by_regex(regex_expression, iterable): """Filter by regular expression. - :param query: names of package files to search for - :type query: str :param regex_expression: the expression to filter by :type regex_expression: str - :param path: directory to look for files - :type path: path-like object - :yields: package files from either the current working directory - or an arbitrary directory + :param iterable: iterable to filter through + :type iterable: does this really need explanation? + :yields: pathlib.Path objects to package files """ - for pkgfile in path.glob(query): - if re.match(regex_expression, str(pkgfile)): - yield pkgfile + for item in iterable: + if re.match(regex_expression, str(item)): + yield Path(item) diff --git a/tests/test_pkgfiles.py b/tests/test_pkgfiles.py index f18a50f..5ba1717 100644 --- a/tests/test_pkgfiles.py +++ b/tests/test_pkgfiles.py @@ -36,7 +36,7 @@ def filter_files(query): # ========== Unit Tests ========== -class TestFilterPkgfiles(unittest.TestCase): +class TestGetPkgfiles(unittest.TestCase): def setUp(self): self.patched_path = patch.object(Path, "glob") self.mocked_glob = self.patched_path.start() @@ -63,7 +63,7 @@ class TestFilterPkgfiles(unittest.TestCase): self.patched_path.stop() -class TestFilterSigfiles(unittest.TestCase): +class TestGetSigfiles(unittest.TestCase): def setUp(self): self.patched_path = patch.object(Path, "glob") self.mocked_glob = self.patched_path.start() @@ -90,6 +90,24 @@ class TestFilterSigfiles(unittest.TestCase): self.patched_path.stop() +class TestFilterPkgfiles(unittest.TestCase): + def test_yield(self): + result = pkgfiles.filter(ALL_PKGFILES) + expected = [s for s in get_all_files() if re.match(PKGREGEX, str(s))] + + self.assertListEqual(list(result), expected) + self.assertIsInstance(result, GeneratorType) + + +class TestFilterSigfiles(unittest.TestCase): + def test_yield(self): + result = pkgfiles.filter(ALL_PKGFILES, signatures_only=True) + expected = [s for s in get_all_files() if re.match(SIGREGEX, str(s))] + + self.assertListEqual(list(result), expected) + self.assertIsInstance(result, GeneratorType) + + class TestAddPkgfile(unittest.TestCase): def setUp(self): self.patched_shutil = patch(f"{TESTING_MODULE}.shutil") @@ -109,7 +127,7 @@ class TestAddPkgfile(unittest.TestCase): self.patched_shutil.stop() -class TestDeletePkgfiles(unittest.TestCase): +class TestDeletePkgfile(unittest.TestCase): def setUp(self): self.pkgfile = MagicMock("/var/cache/repo/pkgfile", spec_set=Path)