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 e76487ca90
commit dff33632ae
2 changed files with 13 additions and 8 deletions
@@ -298,14 +298,17 @@ class Selector:
else: else:
value = value.get(key, None) value = value.get(key, None)
elif isinstance(value, (list, tuple)): # If we use regex elif isinstance(value, (list, tuple)): # If we use regex
results = [] if key.isnumeric():
for v in value: value = value[int(key)]
subvalue = cls.get_element_value(v, [key], is_regex=is_regex) else:
if isinstance(subvalue, list): results = []
results.extend(subvalue) for v in value:
else: subvalue = cls.get_element_value(v, [key], is_regex=is_regex)
results.append(subvalue) if isinstance(subvalue, list):
value = results results.extend(subvalue)
else:
results.append(subvalue)
value = results
return value return value
@classmethod @classmethod
@@ -49,6 +49,8 @@ class TestGetElementValue(test.bootstrap.IFC4):
assert subject.get_element_value(element, "material.MaterialLayers.Name") == ["L1", "L2"] assert subject.get_element_value(element, "material.MaterialLayers.Name") == ["L1", "L2"]
# Allow to use "item" to generically select an item in a material set # 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") == ["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, '"material"."item"."Name"') == ["L1", "L2"]
assert subject.get_element_value(element, 'r"material"."item"."Name"') == ["L1", "L2"] assert subject.get_element_value(element, 'r"material"."item"."Name"') == ["L1", "L2"]
# Provide shortform for convenience # Provide shortform for convenience