Allow tuples as well as lists in MultiParams, refs #799

pull/798/head
Simon Willison 2020-06-05 11:01:06 -07:00
rodzic 0da7f49b24
commit d96ac1d52c
2 zmienionych plików z 19 dodań i 9 usunięć

Wyświetl plik

@ -759,14 +759,14 @@ class MultiParams:
if isinstance(data, dict):
for key in data:
assert isinstance(
data[key], list
data[key], (list, tuple)
), "dictionary data should be a dictionary of key => [list]"
self._data = data
elif isinstance(data, list):
elif isinstance(data, list) or isinstance(data, tuple):
new_data = {}
for item in data:
assert (
isinstance(item, list) and len(item) == 2
isinstance(item, (list, tuple)) and len(item) == 2
), "list data should be a list of [key, value] pairs"
key, value = item
new_data.setdefault(key, []).append(value)

Wyświetl plik

@ -439,10 +439,20 @@ def test_call_with_supported_arguments():
utils.call_with_supported_arguments(foo, a=1)
def test_multi_params_list():
p1 = utils.MultiParams([["foo", "bar"], ["foo", "baz"]])
@pytest.mark.parametrize("data,should_raise", [
([["foo", "bar"], ["foo", "baz"]], False),
([("foo", "bar"), ("foo", "baz")], False),
((["foo", "bar"], ["foo", "baz"]), False),
([["foo", "bar"], ["foo", "baz", "bax"]], True),
({"foo": ["bar", "baz"]}, False),
({"foo": ("bar", "baz")}, False),
({"foo": "bar"}, True),
])
def test_multi_params(data, should_raise):
if should_raise:
with pytest.raises(AssertionError):
utils.MultiParams(data)
return
p1 = utils.MultiParams(data)
assert "bar" == p1["foo"]
assert ["bar", "baz"] == p1.getlist("foo")
# Should raise an error if list isn't pairs
with pytest.raises(AssertionError):
utils.MultiParams([["foo", "bar"], ["foo", "baz", "bar"]])
assert ["bar", "baz"] == list(p1.getlist("foo"))