Source code for anytree.util

"""Utilities."""


[docs]def commonancestors(*nodes): """ Determine common ancestors of `nodes`. >>> from anytree import Node, util >>> udo = Node("Udo") >>> marc = Node("Marc", parent=udo) >>> lian = Node("Lian", parent=marc) >>> dan = Node("Dan", parent=udo) >>> jet = Node("Jet", parent=dan) >>> jan = Node("Jan", parent=dan) >>> joe = Node("Joe", parent=dan) >>> util.commonancestors(jet, joe) (Node('/Udo'), Node('/Udo/Dan')) >>> util.commonancestors(jet, marc) (Node('/Udo'),) >>> util.commonancestors(jet) (Node('/Udo'), Node('/Udo/Dan')) >>> util.commonancestors() () """ ancestors = [node.ancestors for node in nodes] common = [] for parentnodes in zip(*ancestors): parentnode = parentnodes[0] if all(parentnode is p for p in parentnodes[1:]): common.append(parentnode) else: break return tuple(common)
[docs]def leftsibling(node): """ Return Left Sibling of `node`. >>> from anytree import Node, util >>> dan = Node("Dan") >>> jet = Node("Jet", parent=dan) >>> jan = Node("Jan", parent=dan) >>> joe = Node("Joe", parent=dan) >>> print(util.leftsibling(dan)) None >>> print(util.leftsibling(jet)) None >>> print(util.leftsibling(jan)) Node('/Dan/Jet') >>> print(util.leftsibling(joe)) Node('/Dan/Jan') """ if node.parent: pchildren = node.parent.children idx = pchildren.index(node) if idx: return pchildren[idx - 1] return None
[docs]def rightsibling(node): """ Return Right Sibling of `node`. >>> from anytree import Node, util >>> dan = Node("Dan") >>> jet = Node("Jet", parent=dan) >>> jan = Node("Jan", parent=dan) >>> joe = Node("Joe", parent=dan) >>> print(util.rightsibling(dan)) None >>> print(util.rightsibling(jet)) Node('/Dan/Jan') >>> print(util.rightsibling(jan)) Node('/Dan/Joe') >>> print(util.rightsibling(joe)) None """ if node.parent: pchildren = node.parent.children idx = pchildren.index(node) try: return pchildren[idx + 1] except IndexError: return None else: return None