@@ -338,43 +338,43 @@ def walk(obj: t.Any, name: str, is_metadata: t.Optional[bool] = None) -> None:
338338 ):
339339 env [name ] = (obj , is_metadata )
340340 return
341+
342+ if inspect .isclass (obj ):
343+ for var in decorator_vars (obj ):
344+ if obj_module and var in obj_module .__dict__ :
345+ walk (obj_module .__dict__ [var ], var , is_metadata )
346+
347+ for base in obj .__bases__ :
348+ walk (base , base .__qualname__ , is_metadata )
349+
350+ for k , v in obj .__dict__ .items ():
351+ if k .startswith ("__" ):
352+ continue
353+
354+ # Traverse methods in a class to find global references
355+ if isinstance (v , (classmethod , staticmethod )):
356+ v = v .__func__
357+
358+ if callable (v ):
359+ # Walk the method if it's part of the object, else it's a global function and we just store it
360+ if v .__qualname__ .startswith (obj .__qualname__ ):
361+ for k , v in func_globals (v ).items ():
362+ walk (v , k , is_metadata )
363+ else :
364+ walk (v , v .__name__ , is_metadata )
365+ elif callable (obj ):
366+ for k , v in func_globals (obj ).items ():
367+ walk (v , k , is_metadata )
368+
369+ # We store the object in the environment after its dependencies, because otherwise we
370+ # could crash at environment hydration time, since dicts are ordered and the top-level
371+ # objects would be loaded before their dependencies.
372+ env [name ] = (obj , is_metadata )
341373 elif not _globals_match (env [name ][0 ], obj ):
342374 raise SQLMeshError (
343375 f"Cannot store { obj } in environment, duplicate definitions found for '{ name } '"
344376 )
345377
346- if inspect .isclass (obj ):
347- for var in decorator_vars (obj ):
348- if obj_module and var in obj_module .__dict__ :
349- walk (obj_module .__dict__ [var ], var , is_metadata )
350-
351- for base in obj .__bases__ :
352- walk (base , base .__qualname__ , is_metadata )
353-
354- for k , v in obj .__dict__ .items ():
355- if k .startswith ("__" ):
356- continue
357-
358- # Traverse methods in a class to find global references
359- if isinstance (v , (classmethod , staticmethod )):
360- v = v .__func__
361-
362- if callable (v ):
363- # Walk the method if it's part of the object, else it's a global function and we just store it
364- if v .__qualname__ .startswith (obj .__qualname__ ):
365- for k , v in func_globals (v ).items ():
366- walk (v , k , is_metadata )
367- else :
368- walk (v , v .__name__ , is_metadata )
369- elif callable (obj ):
370- for k , v in func_globals (obj ).items ():
371- walk (v , k , is_metadata )
372-
373- # We store the object in the environment after its dependencies, because otherwise we
374- # could crash at environment hydration time, since dicts are ordered and the top-level
375- # objects would be loaded before their dependencies.
376- env [name ] = (obj , is_metadata )
377-
378378 # The "metadata only" annotation of the object is transitive
379379 walk (obj , name , is_metadata_obj or getattr (obj , c .SQLMESH_METADATA , None ))
380380
0 commit comments