@@ -41,14 +41,12 @@ def _build_root_node(self) -> None:
4141 in_degree = {node .identifier : 0 for node in self .nodes }
4242
4343 for node in self .nodes :
44- if node .next_nodes is None :
45- continue
46- for next_node in node .next_nodes :
47- in_degree [next_node ] += 1
44+ if node .next_nodes is not None :
45+ for next_node in node .next_nodes :
46+ in_degree [next_node ] += 1
4847
49- if node .unites is None :
50- continue
51- in_degree [node .identifier ] += 1
48+ if node .unites is not None :
49+ in_degree [node .identifier ] += 1
5250
5351 zero_in_degree_nodes = [node for node in self .nodes if in_degree [node .identifier ] == 0 ]
5452 if len (zero_in_degree_nodes ) != 1 :
@@ -58,29 +56,31 @@ def _build_root_node(self) -> None:
5856 def _build_parents_by_identifier (self ) -> None :
5957 try :
6058 root_node_identifier = self .get_root_node ().identifier
61- self ._parents_by_identifier = {
62- node .identifier : set () for node in self .nodes
63- }
6459
65- visited = set ()
60+ visited = {}
61+
62+ self ._parents_by_identifier = {}
63+ for node in self .nodes :
64+ self ._parents_by_identifier [node .identifier ] = set ()
65+ visited [node .identifier ] = False
6666
6767 def dfs (node_identifier : str , parents : set [str ]) -> None :
6868 assert self ._parents_by_identifier is not None
6969
7070 self ._parents_by_identifier [node_identifier ] = parents | self ._parents_by_identifier [node_identifier ]
7171
72- if node_identifier in visited :
72+ if visited [ node_identifier ] :
7373 return
7474
75- visited . add ( node_identifier )
75+ visited [ node_identifier ] = True
7676
7777 node = self .get_node_by_identifier (node_identifier )
7878 if node is None :
7979 return
8080 if node .next_nodes is None :
8181 return
8282 if node .unites is not None :
83- self ._parents_by_identifier [node .unites .identifier ]. add ( node_identifier )
83+ self ._parents_by_identifier [node_identifier ]. add ( node .unites .identifier )
8484 for next_node_identifier in node .next_nodes :
8585 dfs (next_node_identifier , parents | {node_identifier })
8686
@@ -162,18 +162,13 @@ def _validate_secret_value(cls, secret_value: str) -> None:
162162 except Exception :
163163 raise ValueError ("Value is not valid URL-safe base64 encoded" )
164164
165- @model_validator (mode = 'after' )
166- def validate_nodes (self ) -> Self :
167- for node in self .nodes :
168- if node .namespace != self .namespace :
169- raise ValueError (f"Node namespace { node .namespace } does not match graph namespace { self .namespace } " )
170- return self
171-
172165 @model_validator (mode = 'after' )
173166 def validate_graph_is_connected (self ) -> Self :
174167 errors = []
175168 root_node_identifier = self .get_root_node ().identifier
176169 for node in self .nodes :
170+ if node .identifier == root_node_identifier :
171+ continue
177172 if root_node_identifier not in self .get_parents_by_identifier (node .identifier ):
178173 errors .append (f"Node { node .identifier } is not connected to the root node" )
179174 if errors :
@@ -213,6 +208,10 @@ def verify_input_dependencies(self) -> Self:
213208 for node in self .nodes :
214209 for input_value in node .inputs .values ():
215210 try :
211+ if not isinstance (input_value , str ):
212+ errors .append (f"Input { input_value } is not a string" )
213+ continue
214+
216215 dependent_string = DependentString .create_dependent_string (input_value )
217216 dependent_identifiers = set ([identifier for identifier , _ in dependent_string .get_identifier_field ()])
218217
@@ -272,7 +271,7 @@ def get_parents_by_identifier(self, identifier: str) -> set[str]:
272271 self ._build_parents_by_identifier ()
273272
274273 assert self ._parents_by_identifier is not None
275- return self ._parents_by_identifier [ identifier ]
274+ return self ._parents_by_identifier . get ( identifier , set ())
276275
277276 @staticmethod
278277 async def get (namespace : str , graph_name : str ) -> "GraphTemplate" :
0 commit comments