See #2881. Allow indices in the selector instead of relying on external evaluations.

This commit is contained in:
Dion Moult
2023-04-04 09:58:23 +10:00
parent 1a624c957b
commit a1acdc0977
2 changed files with 13 additions and 8 deletions
@@ -298,14 +298,17 @@ class Selector:
else:
value = value.get(key, None)
elif isinstance(value, (list, tuple)): # If we use regex
results = []
for v in value:
subvalue = cls.get_element_value(v, [key], is_regex=is_regex)
if isinstance(subvalue, list):
results.extend(subvalue)
else:
results.append(subvalue)
value = results
if key.isnumeric():
value = value[int(key)]
else:
results = []
for v in value:
subvalue = cls.get_element_value(v, [key], is_regex=is_regex)
if isinstance(subvalue, list):
results.extend(subvalue)
else:
results.append(subvalue)
value = results
return value
@classmethod
@@ -49,6 +49,8 @@ class TestGetElementValue(test.bootstrap.IFC4):
assert subject.get_element_value(element, "material.MaterialLayers.Name") == ["L1", "L2"]
# Allow to use "item" to generically select an item in a material set
assert subject.get_element_value(element, "material.item.Name") == ["L1", "L2"]
assert subject.get_element_value(element, "material.item.Name.0") == "L1"
assert subject.get_element_value(element, "material.item.Name.1") == "L2"
assert subject.get_element_value(element, '"material"."item"."Name"') == ["L1", "L2"]
assert subject.get_element_value(element, 'r"material"."item"."Name"') == ["L1", "L2"]
# Provide shortform for convenience