self.assertEquals(2, len(find_all(t, "//NameNode/@name")))
self.assertEquals(['fun', 'decorator'], find_all(t, "//NameNode/@name"))
+ def test_node_path_attribute_dotted(self):
+ t = self._build_tree()
+ self.assertEquals(1, len(find_all(t, "//ReturnStatNode/@value.name")))
+ self.assertEquals(['fun'], find_all(t, "//ReturnStatNode/@value.name"))
+
def test_node_path_child(self):
t = self._build_tree()
self.assertEquals(1, len(find_all(t, "//DefNode/ReturnStatNode/NameNode")))
"""
import re
+import sys
path_tokenizer = re.compile(
"("
else:
if token[0] == '=':
value = parse_path_value(next)
- name_path = name.split('.')
+ if sys.version_info >= (2,6) or (sys.version_info >= (2,4) and '.' not in name):
+ import operator
+ readattr = operator.attrgetter(name)
+ else:
+ name_path = name.split('.')
+ def readattr(node):
+ attr_value = node
+ for attr in name_path:
+ attr_value = getattr(attr_value, attr)
+ return attr_value
if value is None:
def select(result):
for node in result:
try:
- attr_value = node
- for attr in name_path:
- attr_value = getattr(attr_value, attr)
+ attr_value = readattr(node)
except AttributeError:
continue
if attr_value is not None:
def select(result):
for node in result:
try:
- attr_value = node
- for attr in name_path:
- attr_value = getattr(attr_value, attr)
+ attr_value = readattr(node)
except AttributeError:
continue
if attr_value == value: