Skip to content

Graph Traversal

traverse

traverse(root: Base) -> Iterator[TraversalContext]
Source code in src/specklepy/objects/graph_traversal/traversal.py
def traverse(self, root: Base) -> Iterator[TraversalContext]:
    stack: List[TraversalContext] = []

    stack.append(TraversalContext(root))

    while len(stack) > 0:
        head = stack.pop()

        current = head.current
        active_rule = self._get_active_rule_or_default_rule(current)

        if active_rule.should_return:
            yield head

        members_to_traverse = active_rule.get_members_to_traverse(current)
        for child_prop in members_to_traverse:
            try:
                if child_prop in {"speckle_type", "units", "applicationId"}:
                    # debug: to avoid noisy exceptions,
                    # explicitly avoid checking ones we know will fail,
                    # this is not exhaustive
                    continue
                if getattr(current, child_prop, None):
                    value = current[child_prop]
                    self._traverse_member_to_stack(stack, value, child_prop, head)
            except KeyError:
                # Unset application ids, and class variables like SpeckleType will
                #  throw when __getitem__ is called
                pass

traverse_member staticmethod

traverse_member(value: Optional[Any]) -> Iterator[Base]
Source code in src/specklepy/objects/graph_traversal/traversal.py
@staticmethod
def traverse_member(value: Optional[Any]) -> Iterator[Base]:
    if isinstance(value, Base):
        yield value
    elif isinstance(value, list):
        for obj in value:
            for o in GraphTraversal.traverse_member(obj):
                yield o
    elif isinstance(value, dict):
        for obj in value.values():
            for o in GraphTraversal.traverse_member(obj):
                yield o

current instance-attribute

current: Base

member_name class-attribute instance-attribute

member_name: Optional[str] = None

parent class-attribute instance-attribute

parent: Optional[TraversalContext] = None

should_return property

should_return: bool

get_members_to_traverse

get_members_to_traverse(o: Base) -> Set[str]
Source code in src/specklepy/objects/graph_traversal/traversal.py
def get_members_to_traverse(self, o: Base) -> Set[str]:
    return set(self._members_to_traverse(o))

does_rule_hold

does_rule_hold(o: Base) -> bool
Source code in src/specklepy/objects/graph_traversal/traversal.py
def does_rule_hold(self, o: Base) -> bool:
    return any(condition(o) for condition in self._conditions)

should_return

should_return() -> bool
Source code in src/specklepy/objects/graph_traversal/traversal.py
def should_return(self) -> bool:
    return False

get_members_to_traverse

get_members_to_traverse(_) -> Set[str]
Source code in src/specklepy/objects/graph_traversal/traversal.py
def get_members_to_traverse(self, _) -> Set[str]:
    return set()

does_rule_hold

does_rule_hold(_) -> bool
Source code in src/specklepy/objects/graph_traversal/traversal.py
def does_rule_hold(self, _) -> bool:
    return True