From d0cead105bd6f053fe5780a341f9878aa2387997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 2 May 2024 17:24:59 +0200 Subject: [PATCH] =?UTF-8?q?[formatter]=20allow=20dots=20etc=20in=20'?= =?UTF-8?q?=E2=80=A6'=20literals=20(#5539)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit don't parse fields starting with ' this disables the ability to directly apply […] to '…' literals, but that's not really useful anyway and can still be done with _lit --- gallery_dl/formatter.py | 7 +++---- test/test_formatter.py | 27 +++++++++++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/gallery_dl/formatter.py b/gallery_dl/formatter.py index b83cf21c..0b212d5e 100644 --- a/gallery_dl/formatter.py +++ b/gallery_dl/formatter.py @@ -243,13 +243,12 @@ class TemplateFStringFormatter(FStringFormatter): def parse_field_name(field_name): + if field_name[0] == "'": + return "_lit", (operator.itemgetter(field_name[1:-1]),) + first, rest = _string.formatter_field_name_split(field_name) funcs = [] - if first[0] == "'": - funcs.append(operator.itemgetter(first[1:-1])) - first = "_lit" - for is_attr, key in rest: if is_attr: func = operator.attrgetter diff --git a/test/test_formatter.py b/test/test_formatter.py index 89cb1aad..73e958cc 100644 --- a/test/test_formatter.py +++ b/test/test_formatter.py @@ -336,14 +336,14 @@ class TestFormatter(unittest.TestCase): def test_literals(self): value = "foo" - self._run_test("{'foo'}" , value) - self._run_test("{'foo'!u}" , value.upper()) - self._run_test("{'f00':R0/o/}" , value) - self._run_test("{'foobar'[:3]}", value) - self._run_test("{z|'foo'}" , value) - self._run_test("{z|''|'foo'}" , value) - self._run_test("{z|''}" , "") - self._run_test("{''|''}" , "") + self._run_test("{'foo'}" , value) + self._run_test("{'foo'!u}" , value.upper()) + self._run_test("{'f00':R0/o/}", value) + + self._run_test("{z|'foo'}" , value) + self._run_test("{z|''|'foo'}" , value) + self._run_test("{z|'foo'!u}" , value.upper()) + self._run_test("{z|'f00':R0/o/}", value) self._run_test("{_lit[foo]}" , value) self._run_test("{_lit[foo]!u}" , value.upper()) @@ -351,6 +351,17 @@ class TestFormatter(unittest.TestCase): self._run_test("{_lit[foobar][:3]}", value) self._run_test("{z|_lit[foo]}" , value) + # empty (#4492) + self._run_test("{z|''}" , "") + self._run_test("{''|''}", "") + + # special characters (dots, brackets, singlee quotes) (#5539) + self._run_test("{'f.o.o'}" , "f.o.o") + self._run_test("{_lit[f.o.o]}", "f.o.o") + self._run_test("{_lit[f'o'o]}", "f'o'o") + self._run_test("{'f.[].[]'}" , "f.[].[]") + self._run_test("{z|'f.[].[]'}", "f.[].[]") + def test_template(self): with tempfile.TemporaryDirectory() as tmpdirname: path1 = os.path.join(tmpdirname, "tpl1")