def build_resource_dependency_graph(resource_classes,
                                    include_backrefs=False):
    """
    Builds a graph of dependencies among the given resource classes.

    The dependency graph is a directed graph with member resource classes as
    nodes. An edge between two nodes represents a member or collection
    attribute.

    :param resource_classes: resource classes to determine interdependencies
      of.
    :type resource_classes: sequence of registered resources.
    :param bool include_backrefs: flag indicating if dependencies
      introduced by back-references (e.g., a child resource referencing its
      parent) should be included in the dependency graph.
    """
    def visit(mb_cls, grph, path, incl_backrefs):
        for attr_name in get_resource_class_attribute_names(mb_cls):
            if is_resource_class_terminal_attribute(mb_cls, attr_name):
                continue
            child_descr = getattr(mb_cls, attr_name)
            child_mb_cls = get_member_class(child_descr.attr_type)
            # We do not follow cyclic references back to a resource class
            # that is last in the path.
            if len(path) > 0 and child_mb_cls is path[-1] \
               and not incl_backrefs:
                continue
            if not grph.has_node(child_mb_cls):
                grph.add_node(child_mb_cls)
                path.append(mb_cls)
                visit(child_mb_cls, grph, path, incl_backrefs)
                path.pop()
            if not grph.has_edge((mb_cls, child_mb_cls)):
                grph.add_edge((mb_cls, child_mb_cls))
    dep_grph = digraph()
    for resource_class in resource_classes:
        mb_cls = get_member_class(resource_class)
        if not dep_grph.has_node(mb_cls):
            dep_grph.add_node(mb_cls)
            visit(mb_cls, dep_grph, [], include_backrefs)
    return dep_grph
def build_resource_dependency_graph ( resource_classes , include_backrefs = False ) : def visit ( mb_cls , grph , path , incl_backrefs ) : for attr_name in get_resource_class_attribute_names ( mb_cls ) : if is_resource_class_terminal_attribute ( mb_cls , attr_name ) : continue child_descr = getattr ( mb_cls , attr_name ) child_mb_cls = get_member_class ( child_descr . attr_type ) if len ( path ) > 0 and child_mb_cls is path [ - 1 ] and not incl_backrefs : continue if not grph . has_node ( child_mb_cls ) : grph . add_node ( child_mb_cls ) path . append ( mb_cls ) visit ( child_mb_cls , grph , path , incl_backrefs ) path . pop ( ) if not grph . has_edge ( ( mb_cls , child_mb_cls ) ) : grph . add_edge ( ( mb_cls , child_mb_cls ) ) dep_grph = digraph ( ) for resource_class in resource_classes : mb_cls = get_member_class ( resource_class ) if not dep_grph . has_node ( mb_cls ) : dep_grph . add_node ( mb_cls ) visit ( mb_cls , dep_grph , [ ] , include_backrefs ) return dep_grph
Builds a graph of dependencies among the given resource classes.

    The dependency graph is a directed graph with member resource classes as
    nodes. An edge between two nodes represents a member or collection
    attribute.

    :param resource_classes: resource classes to determine interdependencies
      of.
    :type resource_classes: sequence of registered resources.
    :param bool include_backrefs: flag indicating if dependencies
      introduced by back-references (e.g., a child resource referencing its
      parent) should be included in the dependency graph.