prefix_graph#

Implements directed graphs to sort and manipulate packages within a prefix.

Object inheritance:

Inheritance diagram of PrefixGraph, GeneralGraph

Classes#

PrefixGraph

A directed graph structure used for sorting packages (prefix_records) in prefixes and

GeneralGraph

Compared with PrefixGraph, this class takes in more than one record of a given name,

class PrefixGraph(records, specs=())#

A directed graph structure used for sorting packages (prefix_records) in prefixes and manipulating packages within prefixes (e.g. removing and pruning).

The terminology used for edge direction is "parents" and "children" rather than "successors" and "predecessors". The parent nodes of a record are those records in the graph that match the record's "depends" field. E.g. NodeA depends on NodeB, then NodeA is a child of NodeB, and NodeB is a parent of NodeA. Nodes can have zero parents, or more than two parents.

Most public methods mutate the graph.

property records#
remove_spec(spec)#

Remove all matching nodes, and any associated child nodes.

Parameters:

spec (MatchSpec)

Returns:

The removed nodes.

Return type:

tuple[PrefixRecord]

remove_youngest_descendant_nodes_with_specs()#

A specialized method used to determine only dependencies of requested specs.

Returns:

The removed nodes.

Return type:

tuple[PrefixRecord]

prune()#

Prune back all packages until all child nodes are anchored by a spec.

Returns:

The pruned nodes.

Return type:

tuple[PrefixRecord]

get_node_by_name(name)#
all_descendants(node)#
all_ancestors(node)#
_remove_node(node)#

Removes this node and all edges referencing it.

_toposort()#
classmethod _toposort_raise_on_cycles(graph)#
classmethod _topo_sort_handle_cycles(graph)#
static _toposort_pop_key(graph)#

Pop an item from the graph that has the fewest parents. In the case of a tie, use the node with the alphabetically-first package name.

static _toposort_prepare_graph(graph)#
class GeneralGraph(records, specs=())#

Bases: PrefixGraph

Compared with PrefixGraph, this class takes in more than one record of a given name, and operates on that graph from the higher view across any matching dependencies. It is not a Prefix thing, but more like a "graph of all possible candidates" thing, and is used for unsatisfiability analysis

breadth_first_search_by_name(root_spec, target_spec)#

Return shorted path from root_spec to spec_name