[formatter] implement field name alternatives (#525)

The format string '{a|b|c}' will now try to use the value from 'a' and
fall back to 'b' and 'c' if accessing a field raises an exception or
if its value is None.
This commit is contained in:
Mike Fährmann
2020-02-15 17:58:21 +01:00
parent 67ea80222c
commit 7d1da614d9
2 changed files with 80 additions and 33 deletions

View File

@@ -259,6 +259,7 @@ class TestFormatter(unittest.TestCase):
kwdict = {
"a": "hElLo wOrLd",
"b": "äöü",
"d": {"a": "foo", "b": 0, "c": None},
"l": ["a", "b", "c"],
"n": None,
"u": "%27%3C%20/%20%3E%27",
@@ -323,6 +324,22 @@ class TestFormatter(unittest.TestCase):
self._run_test("{missing[key]}", replacement, default)
self._run_test("{missing:?a//}", "a" + default, default)
def test_alternative(self):
self._run_test("{a|z}" , "hElLo wOrLd")
self._run_test("{z|a}" , "hElLo wOrLd")
self._run_test("{z|y|a}" , "hElLo wOrLd")
self._run_test("{z|y|x|a}", "hElLo wOrLd")
self._run_test("{z|n|a|y}", "hElLo wOrLd")
self._run_test("{z|a!C}" , "Hello World")
self._run_test("{z|a:Rh/C/}" , "CElLo wOrLd")
self._run_test("{z|a!C:RH/C/}", "Cello World")
self._run_test("{z|y|x:?</>/}", "")
self._run_test("{d[c]|d[b]|d[a]}", "0")
self._run_test("{d[a]|d[b]|d[c]}", "foo")
self._run_test("{d[z]|d[y]|d[x]}", "None")
def test_slicing(self):
v = self.kwdict["a"]
self._run_test("{a[1:10]}" , v[1:10])