@@ -30,34 +30,16 @@ def __new__(self) -> Self:
3030 """Returns assembled node container."""
3131
3232 comps = self ._collect_comps ()
33- # pp(list(comps.keys()))
3433 adj , comp_types = self ._build_deps (comps )
35- # pp(adj)
36- # pp(comp_types)
3734 build_order = self ._build_order (adj )
38- # pp(build_order)
3935 components = self ._build_comps (build_order , adj , comp_types )
4036 node = self ._build_node (components )
4137
42- old = list (comps .keys ())
43- new = build_order
44-
45- result = []
46-
47- for idx , item in enumerate (new ):
48- old_idx = old .index (item )
49- if old_idx == idx :
50- result .append (f"{ idx } . { item } " )
51- else :
52- result .append (f"{ idx } . { item } (moved from { old_idx } )" )
53-
54- # print("\n".join(result))
55-
5638 return node
5739
5840 @classmethod
59- def _collect_comps (cls ):
60- comps : dict [ str , Any ] = {}
41+ def _collect_comps (cls ) -> dict [ str , Any ] :
42+ comps = {}
6143 # adds components from base classes, including cls)
6244 for base in inspect .getmro (cls )[:- 1 ]:
6345 for k , v in vars (base ).items ():
@@ -68,7 +50,9 @@ def _collect_comps(cls):
6850 return comps
6951
7052 @classmethod
71- def _build_deps (cls , comps ) -> tuple [dict [str , list [str ]], dict [str , CompType ]]:
53+ def _build_deps (
54+ cls , comps : dict [str , Any ]
55+ ) -> tuple [dict [str , list [str ]], dict [str , CompType ]]:
7256 """Returns dependency graph for components defined in `cls_build_order`.
7357
7458 Graph representation is a dict where each key is a component name,
@@ -102,40 +86,7 @@ def _build_deps(cls, comps) -> tuple[dict[str, list[str]], dict[str, CompType]]:
10286 return dep_graph , comp_types
10387
10488 @classmethod
105- def _find_cycle (cls , adj ) -> list [str ]:
106- visited = set ()
107- stack = []
108- on_stack = set ()
109-
110- def dfs (node ):
111- visited .add (node )
112- stack .append (node )
113- on_stack .add (node )
114-
115- for nxt in adj [node ]:
116- if nxt not in visited :
117- cycle = dfs (nxt )
118- if cycle :
119- return cycle
120-
121- elif nxt in on_stack :
122- idx = stack .index (nxt )
123- return stack [idx :] + [nxt ]
124-
125- stack .pop ()
126- on_stack .remove (node )
127- return None
128-
129- for node in adj :
130- if node not in visited :
131- cycle = dfs (node )
132- if cycle :
133- return cycle
134-
135- return None
136-
137- @classmethod
138- def _build_order (cls , adj ) -> list [str ]:
89+ def _build_order (cls , adj : dict [str , list [str ]]) -> list [str ]:
13990 # adj list: n -> outgoing neighbors
14091
14192 # reverse adj list: n -> incoming neighbors
@@ -171,17 +122,7 @@ def _build_order(cls, adj) -> list[str]:
171122
172123 if len (ordered ) != len (adj ):
173124 cycle_nodes = set (adj .keys ()) - set (ordered )
174- cycle_adj = {}
175- for n in list (cycle_nodes ):
176- cycle_adj [n ] = set (adj [n ]) & cycle_nodes
177- print (n , "->" , cycle_adj [n ])
178-
179- cycle = cls ._find_cycle (cycle_adj )
180-
181- print ("FOUND CYCLE" )
182- print (" -> " .join (cycle ))
183-
184- print (len (ordered ), "/" , len (adj ))
125+ raise Exception (f"Found cycle in dependency graph, the following nodes could not be ordered: { cycle_nodes } " )
185126
186127 return ordered
187128
0 commit comments