From 51ea699083f13fda7f1aad7123ae390fd48eab2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 12 Apr 2018 17:07:12 +0200 Subject: [PATCH] add 'abort()' as function to filter expressions calling 'abort()' in a filter aborts the current extractor run in a cleaner way than using something like 1/0, which causes an error message to be printed --- gallery_dl/util.py | 10 ++++++++++ test/test_util.py | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/gallery_dl/util.py b/gallery_dl/util.py index 19f13d63..8341e084 100644 --- a/gallery_dl/util.py +++ b/gallery_dl/util.py @@ -118,6 +118,13 @@ def advance(iterable, num): return iterator +def raises(obj): + """Returns a function that raises 'obj' as exception""" + def wrap(): + raise obj + return wrap + + def combine_dict(a, b): """Recursively combine the contents of b into a""" for key, value in b.items(): @@ -249,6 +256,7 @@ class FilterPredicate(): "safe_int": safe_int, "urlsplit": urllib.parse.urlsplit, "datetime": datetime.datetime, + "abort": raises(exception.StopExtraction()), "re": re, } @@ -258,6 +266,8 @@ class FilterPredicate(): def __call__(self, url, kwds): try: return eval(self.codeobj, self.globalsdict, kwds) + except exception.GalleryDLException: + raise except Exception as exc: raise exception.FilterError(exc) diff --git a/test/test_util.py b/test/test_util.py index 219d30d0..7c684d89 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -255,6 +255,14 @@ class TestOther(unittest.TestCase): self.assertCountEqual( util.advance(util.advance(items, 1), 2), range(3, 5)) + def test_raises(self): + self.assertRaises(Exception, util.raises(Exception())) + + func = util.raises(ValueError(1)) + self.assertRaises(Exception, func) + self.assertRaises(Exception, func) + self.assertRaises(Exception, func) + def test_combine_dict(self): self.assertEqual( util.combine_dict({}, {}),