88
99from linksmith .model import OutputFormat , OutputFormatRegistry , ResourceType
1010from linksmith .sphinx .inventory import InventoryFormatter
11- from linksmith .sphinx .util import LocalObjectsInv
11+ from linksmith .sphinx .util import LocalConfPy , LocalObjectsInv , read_intersphinx_mapping_urls
1212
1313logger = logging .getLogger (__name__ )
1414
1515
16- def dump_inventory_universal (infiles : t .List [str ], format_ : str = "text" ):
16+ def dump_inventory_universal (infiles : t .List [t . Any ], format_ : str = "text" ):
1717 """
1818 Decode one or multiple intersphinx inventories and output in different formats.
1919 """
2020 if not infiles :
2121 logger .info ("No inventory specified, entering auto-discovery mode" )
22+
23+ infiles = []
2224 try :
2325 local_objects_inv = LocalObjectsInv .discover (Path .cwd ())
2426 logger .info (f"Auto-discovered objects.inv: { local_objects_inv } " )
25- infiles = [str (local_objects_inv )]
27+ infiles += [str (local_objects_inv )]
28+ except Exception as ex :
29+ logger .info (f"No inventory specified, and none discovered: { ex } " )
30+
31+ try :
32+ local_conf_py = LocalConfPy .discover (Path .cwd ())
33+ logger .info (f"Auto-discovered conf.py: { local_conf_py } " )
34+ intersphinx_urls = read_intersphinx_mapping_urls (local_conf_py )
35+ logger .info (f"Expanding infiles: { intersphinx_urls } " )
36+ infiles += [intersphinx_urls ]
2637 except Exception as ex :
27- raise FileNotFoundError (f"No inventory specified, and none discovered: { ex } " )
38+ logger .info (f"No Sphinx project configuration specified, and none discovered: { ex } " )
39+
40+ if not infiles :
41+ raise FileNotFoundError ("No inventory specified, and none discovered" )
2842
2943 # Pre-flight checks.
3044 for infile in infiles :
3145 ResourceType .detect (infile )
3246
3347 # Process input files.
3448 for infile in infiles :
35- if infile .endswith (".inv" ):
36- inventory_to_text (infile , format_ = format_ )
37- elif infile .endswith (".txt" ):
49+ if isinstance (infile , list ) or infile .endswith (".txt" ):
3850 inventories_to_text (infile , format_ = format_ )
51+ elif infile .endswith (".inv" ):
52+ inventory_to_text (infile , format_ = format_ )
53+ else :
54+ raise NotImplementedError (f"Unknown input file type: { infile } " )
3955
4056
4157def inventory_to_text (url : str , format_ : str = "text" ):
@@ -61,7 +77,7 @@ def inventory_to_text(url: str, format_: str = "text"):
6177 inventory .to_yaml ()
6278
6379
64- def inventories_to_text (urls : t .Union [str , Path , io .IOBase ], format_ : str = "text" ):
80+ def inventories_to_text (urls : t .Union [str , Path , io .IOBase , t . List ], format_ : str = "text" ):
6581 """
6682 Display intersphinx inventories of multiple projects, using selected output format.
6783 """
@@ -79,12 +95,14 @@ def inventories_to_text(urls: t.Union[str, Path, io.IOBase], format_: str = "tex
7995 )
8096 print ("<body>" )
8197 resource_type = ResourceType .detect (urls )
82- if resource_type is ResourceType .BUFFER :
98+ url_list = []
99+ if resource_type is ResourceType .LIST :
100+ url_list = t .cast (list , urls )
101+ elif resource_type is ResourceType .BUFFER :
83102 url_list = t .cast (io .IOBase , urls ).read ().splitlines ()
84103 elif resource_type is ResourceType .PATH :
85104 url_list = Path (t .cast (str , urls )).read_text ().splitlines ()
86- # TODO: Test coverage needs to be unlocked by `test_multiple_inventories_url`
87- elif resource_type is ResourceType .URL : # pragma: nocover
105+ elif resource_type is ResourceType .URL :
88106 url_list = requests .get (t .cast (str , urls ), timeout = 10 ).text .splitlines ()
89107
90108 # Generate header.
0 commit comments