Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sage
Path: blob/develop/src/sage_docbuild/ext/inventory_builder.py
6378 views
1
"""
2
Inventory builder
3
4
A customized builder which only generates intersphinx "object.inv"
5
inventory files. The documentation files are not written.
6
"""
7
from __future__ import annotations
8
9
from os import path
10
from pathlib import Path
11
from typing import TYPE_CHECKING, Any
12
from urllib.parse import quote
13
14
from sphinx.builders.dummy import DummyBuilder
15
from sphinx.util.inventory import InventoryFile
16
17
if TYPE_CHECKING:
18
from collections.abc import Iterable
19
20
from sphinx.application import Sphinx
21
22
INVENTORY_FILENAME = "objects.inv"
23
24
25
class InventoryBuilder(DummyBuilder):
26
"""
27
A customized builder which only generates intersphinx "object.inv"
28
inventory files. The documentation files are not written.
29
"""
30
name = "inventory"
31
format = "inventory"
32
epilog = "The inventory file is in %(outdir)s."
33
34
def get_outdated_docs(self) -> Iterable[str]:
35
"""
36
Return an iterable of output files that are outdated.
37
"""
38
assert self.env is not None
39
40
for docname in self.env.found_docs:
41
if docname not in self.env.all_docs:
42
yield docname
43
continue
44
targetname = path.join(self.outdir, INVENTORY_FILENAME)
45
try:
46
targetmtime = path.getmtime(targetname)
47
except Exception:
48
targetmtime = 0
49
try:
50
srcmtime = path.getmtime(self.env.doc2path(docname))
51
if srcmtime > targetmtime:
52
yield docname
53
except OSError:
54
# source doesn't exist anymore
55
pass
56
57
def get_target_uri(self, docname: str, typ: str | None = None) -> str:
58
"""
59
Return the target URI for a document name.
60
"""
61
return quote(docname) + ".html"
62
63
def finish(self) -> None:
64
"""
65
Only write the inventory files.
66
"""
67
assert self.env is not None
68
69
Path(self.outdir).mkdir(parents=True, exist_ok=True)
70
InventoryFile.dump(
71
path.join(self.outdir, INVENTORY_FILENAME), self.env, self
72
)
73
74
75
def setup(app: Sphinx) -> dict[str, Any]:
76
app.add_builder(InventoryBuilder)
77
return {"parallel_read_safe": True}
78
79