diff --git a/anytree/exporter/dictexporter.py b/anytree/exporter/dictexporter.py index 21886d4..ff0ca02 100644 --- a/anytree/exporter/dictexporter.py +++ b/anytree/exporter/dictexporter.py @@ -89,4 +89,8 @@ def _iter_attr_values(self, node): for k, v in node.__dict__.items(): if k in ('_NodeMixin__children', '_NodeMixin__parent'): continue - yield k, v + elif k == "target": + for key, val in self._iter_attr_values(v): + yield key, val + else: + yield k, v diff --git a/tests/test_dictexporter.py b/tests/test_dictexporter.py index 49698fe..59952e6 100644 --- a/tests/test_dictexporter.py +++ b/tests/test_dictexporter.py @@ -3,6 +3,7 @@ from anytree import AnyNode from anytree import Node from anytree import NodeMixin +from anytree import SymlinkNode from anytree.exporter import DictExporter @@ -132,3 +133,33 @@ def __init__(self, foo, parent=None): ]} ]} ) + + +def test_dict_exporter_symlink_node(): + """Dict Exporter.""" + root = Node("root") + s0 = Node("sub0", parent=root) + s0b = Node("sub0B", parent=s0) + s0a = Node("sub0A", parent=s0) + s1 = Node("sub1", parent=root, foo="bar") + s1a = SymlinkNode(target=s0, parent=s1) + s1b = Node("sub1B", parent=s1) + s1c = Node("sub1C", parent=s1) + s1ca = SymlinkNode(target=s1, parent=s1c) + + exporter = DictExporter() + eq_(exporter.export(root), + {'name': 'root', 'children': [ + {'name': 'sub0', 'children': [ + {'name': 'sub0B'}, + {'name': 'sub0A'} + ]}, + {'name': 'sub1', 'foo': 'bar', 'children': [ + {'name': 'sub0'}, + {'name': 'sub1B'}, + {'name': 'sub1C', 'children': [ + {'name': 'sub1', 'foo': 'bar'} + ]} + ]} + ]} + )