1010from typing import TYPE_CHECKING , Any
1111
1212if TYPE_CHECKING :
13+ from collections .abc import Callable
14+
1315 from sphinx .application import Sphinx
1416
1517
2022ROOT = HERE .parent
2123SPX_J2 = HERE / "sphinx-j2.toml"
2224
23-
2425if not os .getenv ("PIXI_PROJECT_ROOT" ):
2526 # provide a fake root doc
2627 root_doc = "rtd"
@@ -36,6 +37,28 @@ def _run_pixi(*_args: Any) -> None:
3637 app .connect ("build-finished" , _run_pixi )
3738
3839else :
40+ from sphinx .builders .html ._assets import _file_checksum # noqa: PLC2701
41+
42+ def setup (app : Sphinx ) -> None :
43+ """Gather builder info."""
44+
45+ def update_context (
46+ app : Sphinx ,
47+ pagename : str , # noqa: ARG001
48+ templatename : str , # noqa: ARG001
49+ context : dict [str , Any ],
50+ doctree : Any , # noqa: ARG001
51+ ) -> None :
52+ def with_v (pathto : Callable [[str , int ], str ], filename : str ) -> str :
53+ outdir = app .builder .outdir
54+ return (
55+ f"""{ pathto (filename , 1 )} ?"""
56+ f"""?v={ _file_checksum (filename = filename , outdir = outdir )} """
57+ )
58+
59+ context ["with_v" ] = with_v
60+
61+ app .connect ("html-page-context" , update_context )
3962
4063 def load_from_pyproject_toml () -> dict [str , Any ]:
4164 """Read templated sphinx config."""
@@ -50,7 +73,7 @@ def load_from_pyproject_toml() -> dict[str, Any]:
5073 k : tomllib .load ((HERE / f"{ v } " ).open ("rb" ))
5174 for k , v in spx_j2 ["context" ].items ()
5275 }
53- config = json .loads (Template (json .dumps (spx_j2 ["template" ])).render (** ctx ))
76+ config = { ** json .loads (Template (json .dumps (spx_j2 ["template" ])).render (** ctx ))}
5477 config .update (
5578 intersphinx_mapping = {k : (v , None ) for k , v in spx_j2 ["intersphinx" ].items ()}
5679 )
0 commit comments