@@ -132,22 +132,47 @@ def source_url(module_name: str) -> str:
132132
133133
134134def resolve_symbol_source (module_name : str , symbol : str ) -> str :
135- try :
136- import_map = parse_import_map (module_name )
137- except FileNotFoundError :
138- return module_name
139- return import_map .get (symbol , module_name )
135+ current_module = module_name
136+ current_symbol = symbol
137+ seen : set [tuple [str , str ]] = set ()
138+
139+ while (current_module , current_symbol ) not in seen :
140+ seen .add ((current_module , current_symbol ))
141+
142+ source_module = None
143+ try :
144+ import_map = parse_import_map (current_module )
145+ except FileNotFoundError :
146+ import_map = {}
147+ source_module = import_map .get (current_symbol )
148+
149+ if source_module is None :
150+ try :
151+ lazy_map = {
152+ item .name : item .source_module
153+ for item in parse_lazy_attrs (current_module )
154+ }
155+ except FileNotFoundError :
156+ lazy_map = {}
157+ source_module = lazy_map .get (current_symbol )
158+
159+ if source_module is None or source_module == current_module :
160+ return current_module
161+
162+ current_module = source_module
140163
164+ return current_module
141165
142- def parse_root_lazy_attrs () -> list [ExportSpec ]:
143- text = read_text (ROOT / "psyflow" / "__init__.py" )
166+
167+ def parse_lazy_attrs (module_name : str ) -> list [ExportSpec ]:
168+ text = read_text (module_file (module_name ))
144169 pattern = re .compile (r'"([^"]+)":\s*\("([^"]+)",\s*"([^"]+)"\)' )
145170 items : list [ExportSpec ] = []
146171 for name , source_module , _attr_name in pattern .findall (text ):
147172 items .append (
148173 ExportSpec (
149174 name = name ,
150- module = "psyflow" ,
175+ module = module_name ,
151176 source_module = source_module ,
152177 )
153178 )
@@ -157,7 +182,7 @@ def parse_root_lazy_attrs() -> list[ExportSpec]:
157182def build_inventory () -> list [dict [str , Any ]]:
158183 groups : list [dict [str , Any ]] = []
159184
160- root_exports = parse_root_lazy_attrs ( )
185+ root_exports = parse_lazy_attrs ( "psyflow" )
161186 groups .append (
162187 {
163188 "module" : "psyflow" ,
@@ -175,19 +200,31 @@ def build_inventory() -> list[dict[str, Any]]:
175200 )
176201
177202 for module_name in ["psyflow.utils" , "psyflow.io" , "psyflow.qa" , "psyflow.sim" ]:
178- export_names = parse_dunder_all (module_name )
179- import_map = parse_import_map (module_name )
180- exports = []
181- for name in export_names :
182- source_module = import_map .get (name , module_name )
183- exports .append (
203+ lazy_exports = parse_lazy_attrs (module_name )
204+ if lazy_exports :
205+ exports = [
184206 {
185- "name" : name ,
186- "source_module" : source_module ,
187- "summary" : doc_summary (source_module , name ),
188- "source_url" : source_url (source_module ),
207+ "name" : item . name ,
208+ "source_module" : item . source_module ,
209+ "summary" : doc_summary (item . source_module , item . name ),
210+ "source_url" : source_url (item . source_module ),
189211 }
190- )
212+ for item in lazy_exports
213+ ]
214+ else :
215+ export_names = parse_dunder_all (module_name )
216+ import_map = parse_import_map (module_name )
217+ exports = []
218+ for name in export_names :
219+ source_module = import_map .get (name , module_name )
220+ exports .append (
221+ {
222+ "name" : name ,
223+ "source_module" : source_module ,
224+ "summary" : doc_summary (source_module , name ),
225+ "source_url" : source_url (source_module ),
226+ }
227+ )
191228 groups .append (
192229 {
193230 "module" : module_name ,
0 commit comments