From ff9066c8e59a543a0df59084c8d2f8ea56c7cb27 Mon Sep 17 00:00:00 2001 From: Teddy Andrieux Date: Tue, 26 May 2020 09:44:26 +0200 Subject: [PATCH] tests: Handle list element in `{get,set}_dict_element` function Add ability to give int in the path so that we can take an element of the list `mydict.0` to get the first element of the list in `mydict` --- tests/utils.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/utils.py b/tests/utils.py index 21c64016f3..eddd62870c 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -170,7 +170,11 @@ def get_dict_element(data, path, delimiter='.'): Traverse a dict using a 'delimiter' on a target string. getitem(a, b) returns the value of a at index b """ - return functools.reduce(operator.getitem, path.split(delimiter), data) + return functools.reduce( + operator.getitem, + (int(k) if k.isdigit() else k for k in path.split(delimiter)), + data + ) def set_dict_element(data, path, value, delimiter='.'): @@ -179,9 +183,12 @@ def set_dict_element(data, path, value, delimiter='.'): and replace the value of a key """ current = data - elements = path.split(delimiter) + elements = [int(k) if k.isdigit() else k for k in path.split(delimiter)] for element in elements[:-1]: - current = current.setdefault(element, {}) + if isinstance(element, int): + current = current[element] if len(current) > element else [] + else: + current = current.setdefault(element, {}) current[elements[-1]] = value