documenteer 2.2.0__tar.gz → 2.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. documenteer-2.4.0/.claude/.gitignore +2 -0
  2. {documenteer-2.2.0 → documenteer-2.4.0}/.github/workflows/ci-cron.yaml +9 -9
  3. {documenteer-2.2.0 → documenteer-2.4.0}/.github/workflows/ci.yaml +11 -11
  4. {documenteer-2.2.0 → documenteer-2.4.0}/CHANGELOG.md +39 -0
  5. documenteer-2.4.0/CLAUDE.md +98 -0
  6. {documenteer-2.2.0 → documenteer-2.4.0}/Makefile +1 -1
  7. {documenteer-2.2.0 → documenteer-2.4.0}/PKG-INFO +1 -1
  8. {documenteer-2.2.0 → documenteer-2.4.0}/demo/rst-technote/index.rst +1 -1
  9. documenteer-2.4.0/demo/rst-technote/local.bib +10 -0
  10. {documenteer-2.2.0 → documenteer-2.4.0}/docs/changelog.md +39 -0
  11. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/api/documenteer.ext.rst +3 -0
  12. {documenteer-2.2.0 → documenteer-2.4.0}/docs/documenteer.toml +5 -1
  13. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/configuration.rst +5 -2
  14. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/toml-reference.rst +41 -0
  15. {documenteer-2.2.0 → documenteer-2.4.0}/docs/index.rst +5 -5
  16. {documenteer-2.2.0 → documenteer-2.4.0}/docs/sphinx-extensions/index.rst +7 -0
  17. documenteer-2.4.0/docs/sphinx-extensions/last-updated.rst +137 -0
  18. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/_templates/README.md +1 -1
  19. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/_templates/README.rst +1 -1
  20. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/edit-locally.rst +1 -1
  21. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/index.rst +1 -0
  22. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/migrate.rst +8 -0
  23. documenteer-2.4.0/docs/technotes/references.rst +135 -0
  24. {documenteer-2.2.0 → documenteer-2.4.0}/pyproject.toml +1 -3
  25. documenteer-2.4.0/src/documenteer/assets/rubin-last-modified.js +45 -0
  26. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rubin-pydata-theme.css +22 -0
  27. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/conf/_toml.py +18 -0
  28. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/conf/_utils.py +79 -5
  29. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/conf/guide.py +26 -0
  30. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/bibtex.py +23 -0
  31. documenteer-2.4.0/src/documenteer/ext/lastmodified.py +402 -0
  32. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/remotecodeblock.py +37 -2
  33. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/README.rst +1 -1
  34. documenteer-2.4.0/src/documenteer/templates/pydata/last-updated.html +14 -0
  35. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer.egg-info/PKG-INFO +1 -1
  36. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer.egg-info/SOURCES.txt +16 -0
  37. documenteer-2.4.0/tests/ext/lastmodified_test.py +347 -0
  38. documenteer-2.4.0/tests/roots/test-lastmodified/conf.py +8 -0
  39. documenteer-2.4.0/tests/roots/test-lastmodified/index.rst +12 -0
  40. documenteer-2.4.0/tests/roots/test-lastmodified/page2.rst +5 -0
  41. documenteer-2.4.0/tests/roots/test-lastmodified/snippet.txt +1 -0
  42. documenteer-2.4.0/tests/storage/__init__.py +0 -0
  43. {documenteer-2.2.0 → documenteer-2.4.0}/tests/test_conf_toml.py +30 -0
  44. documenteer-2.4.0/tests/test_git_repository.py +125 -0
  45. {documenteer-2.2.0 → documenteer-2.4.0}/tox.ini +1 -0
  46. documenteer-2.4.0/uv.lock +2664 -0
  47. {documenteer-2.2.0/src/documenteer/templates/technote → documenteer-2.4.0/.claude/tasks}/.gitkeep +0 -0
  48. {documenteer-2.2.0 → documenteer-2.4.0}/.flake8 +0 -0
  49. {documenteer-2.2.0 → documenteer-2.4.0}/.github/CODE_OF_CONDUCT.md +0 -0
  50. {documenteer-2.2.0 → documenteer-2.4.0}/.github/CONTRIBUTING.md +0 -0
  51. {documenteer-2.2.0 → documenteer-2.4.0}/.github/SUPPORT.md +0 -0
  52. {documenteer-2.2.0 → documenteer-2.4.0}/.github/dependabot.yml +0 -0
  53. {documenteer-2.2.0 → documenteer-2.4.0}/.gitignore +0 -0
  54. {documenteer-2.2.0 → documenteer-2.4.0}/.npmrc +0 -0
  55. {documenteer-2.2.0 → documenteer-2.4.0}/.nvmrc +0 -0
  56. {documenteer-2.2.0 → documenteer-2.4.0}/.pre-commit-config.yaml +0 -0
  57. {documenteer-2.2.0 → documenteer-2.4.0}/.prettierignore +0 -0
  58. {documenteer-2.2.0 → documenteer-2.4.0}/.prettierrc.yaml +0 -0
  59. {documenteer-2.2.0 → documenteer-2.4.0}/.vscode/settings.json +0 -0
  60. {documenteer-2.2.0 → documenteer-2.4.0}/.vscode/tasks.json +0 -0
  61. {documenteer-2.2.0 → documenteer-2.4.0}/LICENSE +0 -0
  62. {documenteer-2.2.0 → documenteer-2.4.0}/MANIFEST.in +0 -0
  63. {documenteer-2.2.0 → documenteer-2.4.0}/README.md +0 -0
  64. {documenteer-2.2.0 → documenteer-2.4.0}/changelog.d/_template.md.jinja +0 -0
  65. {documenteer-2.2.0 → documenteer-2.4.0}/demo/ipynb-technote/.gitignore +0 -0
  66. {documenteer-2.2.0 → documenteer-2.4.0}/demo/ipynb-technote/Makefile +0 -0
  67. {documenteer-2.2.0 → documenteer-2.4.0}/demo/ipynb-technote/conf.py +0 -0
  68. {documenteer-2.2.0 → documenteer-2.4.0}/demo/ipynb-technote/diagram.py +0 -0
  69. {documenteer-2.2.0 → documenteer-2.4.0}/demo/ipynb-technote/extra-notebook.ipynb +0 -0
  70. {documenteer-2.2.0 → documenteer-2.4.0}/demo/ipynb-technote/index.ipynb +0 -0
  71. {documenteer-2.2.0 → documenteer-2.4.0}/demo/ipynb-technote/subdir/subdir-notebook.ipynb +0 -0
  72. {documenteer-2.2.0 → documenteer-2.4.0}/demo/ipynb-technote/technote.toml +0 -0
  73. {documenteer-2.2.0 → documenteer-2.4.0}/demo/md-technote/.gitignore +0 -0
  74. {documenteer-2.2.0 → documenteer-2.4.0}/demo/md-technote/Makefile +0 -0
  75. {documenteer-2.2.0 → documenteer-2.4.0}/demo/md-technote/conf.py +0 -0
  76. {documenteer-2.2.0 → documenteer-2.4.0}/demo/md-technote/diagram.py +0 -0
  77. {documenteer-2.2.0 → documenteer-2.4.0}/demo/md-technote/index.md +0 -0
  78. {documenteer-2.2.0 → documenteer-2.4.0}/demo/md-technote/technote.toml +0 -0
  79. {documenteer-2.2.0 → documenteer-2.4.0}/demo/rst-technote/.gitignore +0 -0
  80. {documenteer-2.2.0 → documenteer-2.4.0}/demo/rst-technote/Makefile +0 -0
  81. {documenteer-2.2.0 → documenteer-2.4.0}/demo/rst-technote/conf.py +0 -0
  82. {documenteer-2.2.0 → documenteer-2.4.0}/demo/rst-technote/diagram.py +0 -0
  83. {documenteer-2.2.0 → documenteer-2.4.0}/demo/rst-technote/technote.toml +0 -0
  84. {documenteer-2.2.0 → documenteer-2.4.0}/docs/.gitignore +0 -0
  85. {documenteer-2.2.0 → documenteer-2.4.0}/docs/Makefile +0 -0
  86. {documenteer-2.2.0 → documenteer-2.4.0}/docs/_rst_epilog.rst +0 -0
  87. {documenteer-2.2.0 → documenteer-2.4.0}/docs/conf.py +0 -0
  88. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/api/documenteer.conf.rst +0 -0
  89. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/api/index.rst +0 -0
  90. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/development.rst +0 -0
  91. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/html-templates.rst +0 -0
  92. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/index.rst +0 -0
  93. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/release.rst +0 -0
  94. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/theme-assets.rst +0 -0
  95. {documenteer-2.2.0 → documenteer-2.4.0}/docs/dev/theme.rst +0 -0
  96. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/badges.rst +0 -0
  97. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/configuration-preset.rst +0 -0
  98. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/diagrams.rst +0 -0
  99. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/extend-conf-py.rst +0 -0
  100. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/including-notebooks.ipynb +0 -0
  101. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/index.rst +0 -0
  102. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/markdown-primer.md +0 -0
  103. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/openapi.rst +0 -0
  104. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/organization.rst +0 -0
  105. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/overview.rst +0 -0
  106. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/page-redirects.rst +0 -0
  107. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/pyproject-configuration.rst +0 -0
  108. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/rst-epilog.rst +0 -0
  109. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/tabsets.rst +0 -0
  110. {documenteer-2.2.0 → documenteer-2.4.0}/docs/guides/video-embeds.rst +0 -0
  111. {documenteer-2.2.0 → documenteer-2.4.0}/docs/sphinx-extensions/docushare-reference.rst +0 -0
  112. {documenteer-2.2.0 → documenteer-2.4.0}/docs/sphinx-extensions/githubbibcache.rst +0 -0
  113. {documenteer-2.2.0 → documenteer-2.4.0}/docs/sphinx-extensions/jira-reference.rst +0 -0
  114. {documenteer-2.2.0 → documenteer-2.4.0}/docs/sphinx-extensions/lsst-pybtex-style.rst +0 -0
  115. {documenteer-2.2.0 → documenteer-2.4.0}/docs/sphinx-extensions/openapi.rst +0 -0
  116. {documenteer-2.2.0 → documenteer-2.4.0}/docs/sphinx-extensions/remote-code-block.rst +0 -0
  117. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/author-metadata.rst +0 -0
  118. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/configuration.rst +0 -0
  119. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/document-status.rst +0 -0
  120. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/edit-on-github.rst +0 -0
  121. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/extensions.rst +0 -0
  122. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/how-your-technote-gets-published.rst +0 -0
  123. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/start-a-technote.rst +0 -0
  124. {documenteer-2.2.0 → documenteer-2.4.0}/docs/technotes/wide-content.rst +0 -0
  125. {documenteer-2.2.0 → documenteer-2.4.0}/licenses/README.md +0 -0
  126. {documenteer-2.2.0 → documenteer-2.4.0}/licenses/astropy-helpers.txt +0 -0
  127. {documenteer-2.2.0 → documenteer-2.4.0}/licenses/sphinx-issue.txt +0 -0
  128. {documenteer-2.2.0 → documenteer-2.4.0}/licenses/sphinx.txt +0 -0
  129. {documenteer-2.2.0 → documenteer-2.4.0}/licenses/sphinxcontrib-redoc.txt +0 -0
  130. {documenteer-2.2.0 → documenteer-2.4.0}/package-lock.json +0 -0
  131. {documenteer-2.2.0 → documenteer-2.4.0}/package.json +0 -0
  132. {documenteer-2.2.0 → documenteer-2.4.0}/postcss.config.js +0 -0
  133. {documenteer-2.2.0 → documenteer-2.4.0}/ruff-shared.toml +0 -0
  134. {documenteer-2.2.0 → documenteer-2.4.0}/setup.cfg +0 -0
  135. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/SourceSans3VF-Italic.ttf.woff2 +0 -0
  136. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/SourceSans3VF-Upright.ttf.woff2 +0 -0
  137. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/_hacks.scss +0 -0
  138. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/_properties.scss +0 -0
  139. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/components/_article-header.scss +0 -0
  140. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/components/_authors.scss +0 -0
  141. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/components/_global-breadcrumbs.scss +0 -0
  142. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/components/_index.scss +0 -0
  143. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/components/_sidebar-section.scss +0 -0
  144. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/components/_version-info.scss +0 -0
  145. {documenteer-2.2.0 → documenteer-2.4.0}/src/assets/rubin-technote/styles/rubin-technote.scss +0 -0
  146. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/__init__.py +0 -0
  147. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/_packagemetadata.py +0 -0
  148. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/_requestsutils.py +0 -0
  149. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/_utils.py +0 -0
  150. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/.gitignore +0 -0
  151. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/731c8feefe13e72a8691.woff2 +0 -0
  152. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/b8bc3440ba2145e132f5.woff2 +0 -0
  153. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/favicon.ico +0 -0
  154. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rsd-assets/rubin-imagotype-color-on-black-crop.svg +0 -0
  155. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rsd-assets/rubin-imagotype-color-on-white-crop.svg +0 -0
  156. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rubin-favicon-transparent-32px.png +0 -0
  157. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rubin-favicon.svg +0 -0
  158. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rubin-technote.css +0 -0
  159. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rubin-technote.css.map +0 -0
  160. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rubin-titlebar-imagotype-dark.svg +0 -0
  161. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/rubin-titlebar-imagotype-light.svg +0 -0
  162. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/scripts/rubin-technote.js +0 -0
  163. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/assets/scripts/rubin-technote.js.map +0 -0
  164. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/cli.py +0 -0
  165. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/conf/__init__.py +0 -0
  166. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/conf/technote.py +0 -0
  167. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/__init__.py +0 -0
  168. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/githubbibcache.py +0 -0
  169. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/jira.py +0 -0
  170. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/lsstdocushare.py +0 -0
  171. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/mockcoderefs.py +0 -0
  172. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/openapi.py +0 -0
  173. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/redoc/__init__.py +0 -0
  174. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/redoc/_redoc.py +0 -0
  175. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/redoc/assets/redoc.html.jinja2 +0 -0
  176. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/ext/robots.py +0 -0
  177. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/py.typed +0 -0
  178. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/services/__init__.py +0 -0
  179. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/services/technoteauthor.py +0 -0
  180. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/services/technotemigration.py +0 -0
  181. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/__init__.py +0 -0
  182. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/authordb.py +0 -0
  183. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/latex.py +0 -0
  184. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/Makefile +0 -0
  185. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/ci.yaml +0 -0
  186. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/conf.py +0 -0
  187. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/dependabot.yml +0 -0
  188. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/gitignore +0 -0
  189. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/pre-commit-config.yaml +0 -0
  190. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/requirements.txt +0 -0
  191. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates/technote/tox.ini +0 -0
  192. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/localtemplates.py +0 -0
  193. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/storage/technotetoml.py +0 -0
  194. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/templates/pydata/autosummary_core/exception.rst +0 -0
  195. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/templates/pydata/autosummary_core/pydantic_model.rst +0 -0
  196. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/templates/pydata/layout.html +0 -0
  197. {documenteer-2.2.0/src/documenteer/templates/technote/components → documenteer-2.4.0/src/documenteer/templates/technote}/.gitkeep +0 -0
  198. {documenteer-2.2.0/src/documenteer/templates/technote/sections → documenteer-2.4.0/src/documenteer/templates/technote/components}/.gitkeep +0 -0
  199. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/templates/technote/components/sidebar-source.html +0 -0
  200. /documenteer-2.2.0/tests/__init__.py → /documenteer-2.4.0/src/documenteer/templates/technote/sections/.gitkeep +0 -0
  201. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/templates/technote/sections/header-article.html +0 -0
  202. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/templates/technote/sections/sidebar-primary.html +0 -0
  203. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer/version.py +0 -0
  204. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer.egg-info/dependency_links.txt +0 -0
  205. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer.egg-info/entry_points.txt +0 -0
  206. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer.egg-info/requires.txt +0 -0
  207. {documenteer-2.2.0 → documenteer-2.4.0}/src/documenteer.egg-info/top_level.txt +0 -0
  208. {documenteer-2.2.0/tests/ext → documenteer-2.4.0/tests}/__init__.py +0 -0
  209. {documenteer-2.2.0 → documenteer-2.4.0}/tests/conftest.py +0 -0
  210. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/afw.doxygen.conf +0 -0
  211. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/authordb.yaml +0 -0
  212. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/doxygen.tag.zip +0 -0
  213. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/package_alpha/doc/_static/package_alpha/README.md +0 -0
  214. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/package_alpha/doc/doxygen.conf.in +0 -0
  215. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/package_alpha/doc/manifest.yaml +0 -0
  216. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/package_alpha/doc/package.alpha/index.rst +0 -0
  217. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/package_alpha/doc/package_alpha/index.rst +0 -0
  218. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/package_alpha/include/README.md +0 -0
  219. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/package_alpha/src/README.md +0 -0
  220. {documenteer-2.2.0 → documenteer-2.4.0}/tests/data/package_beta/doc/README.md +0 -0
  221. {documenteer-2.2.0/tests/services → documenteer-2.4.0/tests/ext}/__init__.py +0 -0
  222. {documenteer-2.2.0 → documenteer-2.4.0}/tests/ext/jira_test.py +0 -0
  223. {documenteer-2.2.0 → documenteer-2.4.0}/tests/ext/lsstdocushare_test.py +0 -0
  224. {documenteer-2.2.0 → documenteer-2.4.0}/tests/ext/mockcoderefs_test.py +0 -0
  225. {documenteer-2.2.0 → documenteer-2.4.0}/tests/ext/redoc_test.py +0 -0
  226. {documenteer-2.2.0 → documenteer-2.4.0}/tests/ext/robots_test.py +0 -0
  227. {documenteer-2.2.0 → documenteer-2.4.0}/tests/packagemetadata_test.py +0 -0
  228. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-autocppapi/conf.py +0 -0
  229. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-autocppapi/doxygen.tag.zip +0 -0
  230. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-autocppapi/index.rst +0 -0
  231. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-redoc/_static/openapi.json +0 -0
  232. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-redoc/api.rst +0 -0
  233. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-redoc/conf.py +0 -0
  234. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-redoc/documenteer.toml +0 -0
  235. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-redoc/index.rst +0 -0
  236. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-robots-nositemap/conf.py +0 -0
  237. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-robots-nositemap/index.rst +0 -0
  238. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-robots-nositemap/page1.rst +0 -0
  239. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-robots-sitemap/conf.py +0 -0
  240. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-robots-sitemap/index.rst +0 -0
  241. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-robots-sitemap/page1.rst +0 -0
  242. {documenteer-2.2.0 → documenteer-2.4.0}/tests/roots/test-robots-sitemap/page2.rst +0 -0
  243. {documenteer-2.2.0/tests/storage → documenteer-2.4.0/tests/services}/__init__.py +0 -0
  244. {documenteer-2.2.0 → documenteer-2.4.0}/tests/services/technotemigration_test.py +0 -0
  245. {documenteer-2.2.0 → documenteer-2.4.0}/tests/storage/authordb_test.py +0 -0
  246. {documenteer-2.2.0 → documenteer-2.4.0}/tests/storage/technotetoml_test.py +0 -0
  247. {documenteer-2.2.0 → documenteer-2.4.0}/tests/test_conf_utils.py +0 -0
  248. {documenteer-2.2.0 → documenteer-2.4.0}/webpack.config.js +0 -0
@@ -0,0 +1,2 @@
1
+ settings.local.json
2
+ tasks/*.md
@@ -16,14 +16,14 @@ jobs:
16
16
  lint:
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@v4
19
+ - uses: actions/checkout@v6
20
20
 
21
21
  - name: Set up Python
22
- uses: actions/setup-python@v5
22
+ uses: actions/setup-python@v6
23
23
  with:
24
24
  python-version: ${{ env.PYTHON_VERSION }}
25
25
 
26
- - uses: actions/setup-node@v4
26
+ - uses: actions/setup-node@v6
27
27
  with:
28
28
  cache: 'npm'
29
29
  node-version-file: '.nvmrc'
@@ -71,11 +71,11 @@ jobs:
71
71
  - "dev"
72
72
 
73
73
  steps:
74
- - uses: actions/checkout@v4
74
+ - uses: actions/checkout@v6
75
75
  with:
76
76
  fetch-depth: 0 # full history for setuptools_scm
77
77
 
78
- - uses: actions/setup-node@v4
78
+ - uses: actions/setup-node@v6
79
79
  with:
80
80
  node-version-file: '.nvmrc'
81
81
 
@@ -115,11 +115,11 @@ jobs:
115
115
  runs-on: ubuntu-latest
116
116
 
117
117
  steps:
118
- - uses: actions/checkout@v4
118
+ - uses: actions/checkout@v6
119
119
  with:
120
120
  fetch-depth: 0 # full history for setuptools_scm
121
121
 
122
- - uses: actions/setup-node@v4
122
+ - uses: actions/setup-node@v6
123
123
  with:
124
124
  cache: 'npm'
125
125
  node-version-file: '.nvmrc'
@@ -160,11 +160,11 @@ jobs:
160
160
  runs-on: ubuntu-latest
161
161
 
162
162
  steps:
163
- - uses: actions/checkout@v4
163
+ - uses: actions/checkout@v6
164
164
  with:
165
165
  fetch-depth: 0 # full history for setuptools_scm
166
166
 
167
- - uses: actions/setup-node@v4
167
+ - uses: actions/setup-node@v6
168
168
  with:
169
169
  node-version-file: '.nvmrc'
170
170
 
@@ -22,14 +22,14 @@ jobs:
22
22
  lint:
23
23
  runs-on: ubuntu-latest
24
24
  steps:
25
- - uses: actions/checkout@v4
25
+ - uses: actions/checkout@v6
26
26
 
27
27
  - name: Set up Python
28
- uses: actions/setup-python@v5
28
+ uses: actions/setup-python@v6
29
29
  with:
30
30
  python-version: ${{ env.PYTHON_VERSION }}
31
31
 
32
- - uses: actions/setup-node@v4
32
+ - uses: actions/setup-node@v6
33
33
  with:
34
34
  cache: 'npm'
35
35
  node-version-file: '.nvmrc'
@@ -65,11 +65,11 @@ jobs:
65
65
  - '8'
66
66
 
67
67
  steps:
68
- - uses: actions/checkout@v4
68
+ - uses: actions/checkout@v6
69
69
  with:
70
70
  fetch-depth: 0 # full history for setuptools_scm
71
71
 
72
- - uses: actions/setup-node@v4
72
+ - uses: actions/setup-node@v6
73
73
  with:
74
74
  cache: 'npm'
75
75
  node-version-file: '.nvmrc'
@@ -99,14 +99,14 @@ jobs:
99
99
  runs-on: ubuntu-latest
100
100
 
101
101
  steps:
102
- - uses: actions/checkout@v4
102
+ - uses: actions/checkout@v6
103
103
  with:
104
104
  fetch-depth: 0 # full history for setuptools_scm
105
105
 
106
106
  - name: Setup Graphviz
107
107
  uses: ts-graphviz/setup-graphviz@v2
108
108
 
109
- - uses: actions/setup-node@v4
109
+ - uses: actions/setup-node@v6
110
110
  with:
111
111
  cache: 'npm'
112
112
  node-version-file: '.nvmrc'
@@ -148,11 +148,11 @@ jobs:
148
148
  runs-on: ubuntu-latest
149
149
 
150
150
  steps:
151
- - uses: actions/checkout@v4
151
+ - uses: actions/checkout@v6
152
152
  with:
153
153
  fetch-depth: 0 # full history for setuptools_scm
154
154
 
155
- - uses: actions/setup-node@v4
155
+ - uses: actions/setup-node@v6
156
156
  with:
157
157
  cache: 'npm'
158
158
  node-version-file: '.nvmrc'
@@ -185,11 +185,11 @@ jobs:
185
185
  if: github.event_name == 'release' && github.event.action == 'published'
186
186
 
187
187
  steps:
188
- - uses: actions/checkout@v4
188
+ - uses: actions/checkout@v6
189
189
  with:
190
190
  fetch-depth: 0 # full history for setuptools_scm
191
191
 
192
- - uses: actions/setup-node@v4
192
+ - uses: actions/setup-node@v6
193
193
  with:
194
194
  cache: 'npm'
195
195
  node-version-file: '.nvmrc'
@@ -2,6 +2,45 @@
2
2
 
3
3
  <!-- scriv-insert-here -->
4
4
 
5
+ <a id='changelog-2.4.0'></a>
6
+ ## 2.4.0 (2026-06-17)
7
+
8
+ ### New features
9
+
10
+ - User guide pages now show a "This page was last modified on <date>." timestamp at the bottom of each page, derived from the page's Git commit history. The date is the most recent commit across the page's own source file and any files it pulls in via `include`/`literalinclude`, so editing an included snippet updates every page that uses it. This is on by default and can be disabled with `show_last_updated = false` in the `[sphinx.theme]` table of `documenteer.toml`.
11
+
12
+ The footer date is rendered as a `<time>` element whose `datetime` attribute carries the canonical UTC ISO 8601 timestamp, and a small bundled script (`rubin-last-modified.js`) rewrites the visible text to the reader's own local date (for example "June 1, 2024"). With JavaScript disabled the element falls back to the UTC date as `YYYY-MM-DD`. This ensures readers in any timezone see the correct calendar day, which a fixed UTC date can otherwise misrepresent.
13
+
14
+ The extension is also the single source of truth for the page's last-modified date in the HTML `<head>`: it emits the same Git date as an `article:modified_time` (Open Graph), `dcterms.modified` (Dublin Core), and a Schema.org `dateModified` (JSON-LD). The user-guide preset sets `git_last_updated_metatags = false` so the auto-loaded `sphinx-last-updated-by-git` extension (still used for the sitemap) doesn't emit a duplicate Open Graph tag from a separate Git computation.
15
+
16
+ Because the date comes from Git, CI builds must check out the full history (set `fetch-depth: 0` with `actions/checkout`). To avoid publishing misleading dates, Documenteer detects a shallow clone, omits the timestamp from every page, and emits a build warning.
17
+
18
+ ### Other changes
19
+
20
+ - Fixed pytest configuration in `pyproject.toml` by consolidating conflicting `[tool.pytest]` and `[tool.pytest.ini_options]` sections into a single `[tool.pytest.ini_options]` section. This resolves an error that prevented tests from running.
21
+
22
+ <a id='changelog-2.3.0'></a>
23
+ ## 2.3.0 (2025-09-03)
24
+
25
+ ### New features
26
+
27
+ - Improved configuration defaults for `documenteer.conf.guide` and `documenteer.conf.technote`:
28
+
29
+ - Add `sentry_sdk` to default non-intersphinx packages
30
+ - Ignore `TypeAliasType` due to sphinx bug
31
+ - Ignore `asyncio.Event`, it has the same problem as `asyncio.Lock`
32
+
33
+ - [ASCL](https://ascl.net) identifiers in bibliography entries are now hyperlinked.
34
+
35
+ ### Bug fixes
36
+
37
+ - Vendored `parse_line_num_spec` from Sphinx to accommodate differences between Sphinx 7 and 8.
38
+ - Fix `nitpick_ignore_regex` regexes, they weren't being applied due to a missing `.`
39
+
40
+ ### Other changes
41
+
42
+ - Added documentation on creating bibliographies in technotes.
43
+
5
44
  <a id='changelog-2.2.0'></a>
6
45
  ## 2.2.0 (2025-08-06)
7
46
 
@@ -0,0 +1,98 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ Documenteer is a Python package that provides Sphinx documentation tools, extensions, and configurations for Rubin Observatory/LSST projects. It supports two main documentation types:
8
+ - **User guides**: Complete documentation sites using pydata-sphinx-theme
9
+ - **Technotes**: Single-document technical notes using the technote theme
10
+
11
+ ## Development Commands
12
+
13
+ ### Setup and Installation
14
+ ```bash
15
+ make init # Initialize development environment
16
+ pip install -e ".[technote,guide]" --group dev # Install with all extras
17
+ ```
18
+
19
+ ### Testing and Quality Assurance
20
+ ```bash
21
+ tox -e py-test-sphinx8 # Run tests with Sphinx 8.x
22
+ tox -e coverage-report # Generate coverage report
23
+ tox -e typing-sphinx8 # Run mypy type checking
24
+ tox -e lint # Run linting (pre-commit hooks + prettier)
25
+ tox -e demo # Build demo technote projects (end-to-end test)
26
+ tox -e packaging # Check PyPI packaging
27
+ ```
28
+
29
+ ### Documentation
30
+ ```bash
31
+ tox -e docs # Build documentation
32
+ tox -e docs-lint # Check documentation links
33
+ ```
34
+
35
+ ### Cleanup
36
+ ```bash
37
+ make clean # Remove build artifacts
38
+ ```
39
+
40
+ ## Architecture
41
+
42
+ ### Core Components
43
+
44
+ **Configuration System** (`src/documenteer/conf/`):
45
+ - `guide.py`: Sphinx configuration preset for user guides
46
+ - `technote.py`: Sphinx configuration preset for technotes
47
+ - `_toml.py`: TOML-based configuration models using Pydantic
48
+ - Uses pydata-sphinx-theme for guides, [technote](https://github.com/lsst-sqre/technote) package for technotes
49
+
50
+ **Sphinx Extensions** (`src/documenteer/ext/`):
51
+ - `jira.py`: JIRA ticket references
52
+ - `lsstdocushare.py`: LSST DocuShare document links
53
+ - `openapi.py`: OpenAPI documentation integration
54
+ - `githubbibcache.py`: GitHub-based bibliography caching
55
+ - `bibtex.py`: Enhanced BibTeX support
56
+ - `remotecodeblock.py`: Remote code inclusion
57
+ - `mockcoderefs.py`: Mock code references for testing
58
+ - `redoc.py`: Redoc integration for HTTP API documentation
59
+ - `robots.py`: robots.txt generation
60
+
61
+ **CLI Tools** (`src/documenteer/cli.py`):
62
+ - `technote add-author`: Add authors to technote.toml from authordb
63
+ - `technote sync-authors`: Sync author info from central database
64
+ - `technote migrate`: Migrate legacy technotes to modern format
65
+
66
+ **Services** (`src/documenteer/services/`):
67
+ - `technoteauthor.py`: Author management for technotes
68
+ - `technotemigration.py`: Legacy technote migration logic
69
+
70
+ ### Key Design Patterns
71
+
72
+ - **Configuration as Code**: Sphinx configurations are Python modules that can be imported
73
+ - **Pydantic Models**: TOML configuration validation using type-safe models
74
+ - **Extension Architecture**: Modular Sphinx extensions for specific Rubin/LSST needs
75
+ - **Theme Integration**: Tight integration with pydata-sphinx-theme and technote themes
76
+
77
+ ### Testing Strategy
78
+
79
+ - Uses tox for multi-environment testing across Sphinx versions
80
+ - Sphinx test roots in `tests/roots/` for extension testing
81
+ - Coverage reporting with branch coverage
82
+ - Type checking with mypy
83
+ - Pre-commit hooks for code quality
84
+
85
+ ### Code Style
86
+
87
+ - Follows ruff formatting (run lint command to automatically format)
88
+ - Numpydoc docstrings with types omitted (Sphinx documentation uses type annotations)
89
+
90
+ ### Asset Management
91
+
92
+ Static assets are managed in `src/documenteer/assets/` including:
93
+ - Custom CSS and SCSS for Rubin branding
94
+ - JavaScript enhancements
95
+ - Favicon and logo assets
96
+ - Font files (Source Sans Pro)
97
+
98
+ Built assets are compiled using webpack with PostCSS processing.
@@ -9,7 +9,7 @@ help:
9
9
  init:
10
10
  rm -rf .tox
11
11
  uv pip install --upgrade pre-commit tox tox-uv scriv
12
- uv pip install -e ".[technote,pipelines]" --group dev
12
+ uv pip install -e ".[technote,guide]" --group dev
13
13
  pre-commit install
14
14
 
15
15
  .PHONY: clean
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: documenteer
3
- Version: 2.2.0
3
+ Version: 2.4.0
4
4
  Summary: Rubin Observatory / LSST Sphinx documentation tools, extensions, and configurations.
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://documenteer.lsst.io
@@ -29,7 +29,7 @@ A list:
29
29
  - Second item
30
30
  - Third item
31
31
 
32
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin facilisis pharetra neque, at semper nulla mattis auctor. Proin semper mollis enim eget interdum. Mauris eleifend eget diam vitae bibendum. Praesent ut aliquet odio, sodales imperdiet nisi. Nam interdum imperdiet tortor sed fringilla. Maecenas efficitur mi sodales nulla commodo rutrum. Ut ornare diam quam, sed commodo turpis aliquam et. In nec enim consequat, suscipit tortor sit amet, luctus ante. Integer dictum augue diam, non pulvinar massa euismod in. Morbi viverra condimentum auctor. Nullam et metus mauris. Cras risus ex, porta sit amet nibh et, dapibus auctor leo.
32
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin facilisis pharetra neque, at semper nulla mattis auctor. Proin semper mollis enim eget interdum. Mauris eleifend eget diam vitae bibendum. Praesent ut aliquet odio, sodales imperdiet nisi. Nam interdum imperdiet tortor sed fringilla. Maecenas efficitur mi sodales nulla commodo rutrum. Ut ornare diam quam, sed commodo turpis aliquam et. In nec enim consequat, suscipit tortor sit amet, luctus ante. Integer dictum augue diam, non pulvinar massa euismod in. Morbi viverra condimentum auctor. Nullam et metus mauris. Cras risus ex, porta sit amet nibh et, dapibus auctor leo. :cite:`2010ascl.soft10043C`
33
33
 
34
34
  .. code-block:: python
35
35
  :caption: hello.py
@@ -0,0 +1,10 @@
1
+ @software{2010ascl.soft10043C,
2
+ author = {{Conroy}, Charlie and {Gunn}, James E.},
3
+ title = "{FSPS: Flexible Stellar Population Synthesis}",
4
+ howpublished = {Astrophysics Source Code Library, record ascl:1010.043},
5
+ year = 2010,
6
+ month = oct,
7
+ eid = {ascl:1010.043},
8
+ adsurl = {https://ui.adsabs.harvard.edu/abs/2010ascl.soft10043C},
9
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
10
+ }
@@ -2,6 +2,45 @@
2
2
 
3
3
  <!-- scriv-insert-here -->
4
4
 
5
+ <a id='changelog-2.4.0'></a>
6
+ ## 2.4.0 (2026-06-17)
7
+
8
+ ### New features
9
+
10
+ - User guide pages now show a "This page was last modified on <date>." timestamp at the bottom of each page, derived from the page's Git commit history. The date is the most recent commit across the page's own source file and any files it pulls in via `include`/`literalinclude`, so editing an included snippet updates every page that uses it. This is on by default and can be disabled with `show_last_updated = false` in the `[sphinx.theme]` table of `documenteer.toml`.
11
+
12
+ The footer date is rendered as a `<time>` element whose `datetime` attribute carries the canonical UTC ISO 8601 timestamp, and a small bundled script (`rubin-last-modified.js`) rewrites the visible text to the reader's own local date (for example "June 1, 2024"). With JavaScript disabled the element falls back to the UTC date as `YYYY-MM-DD`. This ensures readers in any timezone see the correct calendar day, which a fixed UTC date can otherwise misrepresent.
13
+
14
+ The extension is also the single source of truth for the page's last-modified date in the HTML `<head>`: it emits the same Git date as an `article:modified_time` (Open Graph), `dcterms.modified` (Dublin Core), and a Schema.org `dateModified` (JSON-LD). The user-guide preset sets `git_last_updated_metatags = false` so the auto-loaded `sphinx-last-updated-by-git` extension (still used for the sitemap) doesn't emit a duplicate Open Graph tag from a separate Git computation.
15
+
16
+ Because the date comes from Git, CI builds must check out the full history (set `fetch-depth: 0` with `actions/checkout`). To avoid publishing misleading dates, Documenteer detects a shallow clone, omits the timestamp from every page, and emits a build warning.
17
+
18
+ ### Other changes
19
+
20
+ - Fixed pytest configuration in `pyproject.toml` by consolidating conflicting `[tool.pytest]` and `[tool.pytest.ini_options]` sections into a single `[tool.pytest.ini_options]` section. This resolves an error that prevented tests from running.
21
+
22
+ <a id='changelog-2.3.0'></a>
23
+ ## 2.3.0 (2025-09-03)
24
+
25
+ ### New features
26
+
27
+ - Improved configuration defaults for `documenteer.conf.guide` and `documenteer.conf.technote`:
28
+
29
+ - Add `sentry_sdk` to default non-intersphinx packages
30
+ - Ignore `TypeAliasType` due to sphinx bug
31
+ - Ignore `asyncio.Event`, it has the same problem as `asyncio.Lock`
32
+
33
+ - [ASCL](https://ascl.net) identifiers in bibliography entries are now hyperlinked.
34
+
35
+ ### Bug fixes
36
+
37
+ - Vendored `parse_line_num_spec` from Sphinx to accommodate differences between Sphinx 7 and 8.
38
+ - Fix `nitpick_ignore_regex` regexes, they weren't being applied due to a missing `.`
39
+
40
+ ### Other changes
41
+
42
+ - Added documentation on creating bibliographies in technotes.
43
+
5
44
  <a id='changelog-2.2.0'></a>
6
45
  ## 2.2.0 (2025-08-06)
7
46
 
@@ -11,6 +11,9 @@ documenteer.ext
11
11
  .. automodapi:: documenteer.ext.jira
12
12
  :no-inheritance-diagram:
13
13
 
14
+ .. automodapi:: documenteer.ext.lastmodified
15
+ :no-inheritance-diagram:
16
+
14
17
  .. automodapi:: documenteer.ext.lsstdocushare
15
18
  :no-inheritance-diagram:
16
19
 
@@ -45,7 +45,11 @@ technote = "https://technote.lsst.io/"
45
45
  [sphinx.linkcheck]
46
46
  ignore = [
47
47
  "https://mermaid-js.github.io",
48
- "https://rubin-obs.slack.com"
48
+ "https://rubin-obs.slack.com",
49
+ "https://slack.com/app_redirect",
50
+ # github.dev redirects to the vscode.dev SPA, which doesn't finish
51
+ # loading within linkcheck's timeout and reports a false-positive timeout.
52
+ "https://github.dev",
49
53
  ]
50
54
 
51
55
  [sphinx.redirects]
@@ -18,11 +18,14 @@ How you do this depends on your project's packaging structure:
18
18
  .. code-block:: toml
19
19
  :caption: pyproject.toml
20
20
 
21
- [project.optional-dependencies]
22
- dev = [
21
+ [dependency-groups]
22
+ docs = [
23
23
  "documenteer[guide]"
24
24
  ]
25
25
 
26
+ Dependency groups are a way organize development dependencies and are supported by `uv <https://docs.astral.sh/uv/concepts/projects/dependencies/#development-dependencies>`__.
27
+ Dependency groups are preferred over earlier methods of specifying optional dependencies because they are not published as installable dependencies from PyPI.
28
+
26
29
  .. tab-item:: requirements.txt
27
30
 
28
31
  .. code-block:: text
@@ -426,6 +426,47 @@ This configuration requires information about the GitHub repository from these o
426
426
  - :ref:`project.github_url <guide-project-github-url>`
427
427
  - :ref:`project.github_default_branch <guide-project-github-default-branch>`
428
428
 
429
+ .. _guide-project-show-last-updated:
430
+
431
+ show_last_updated
432
+ -----------------
433
+
434
+ |optional|
435
+
436
+ Default is ``true``, so that each page shows a "Last updated on <date>." timestamp at the bottom of each page.
437
+
438
+ .. seealso::
439
+
440
+ :doc:`/sphinx-extensions/last-updated` for how the date is computed and the extension's
441
+ Sphinx configuration values.
442
+
443
+ The date is computed from the page's **Git commit history**, not the filesystem modification time (which is meaningless in CI).
444
+ It is the most recent commit date across the page's own source file *and* any files the page pulls in with ``include`` or ``literalinclude`` directives, so editing an included snippet updates every page that uses it.
445
+ Because the date is the last *commit* date, uncommitted local edits don't change it; a page whose source has never been committed shows no timestamp.
446
+
447
+ Set this to ``false`` to hide the timestamp:
448
+
449
+ .. code-block:: toml
450
+ :caption: documenteer.toml
451
+
452
+ [sphinx.theme]
453
+ show_last_updated = false
454
+
455
+ .. important::
456
+
457
+ Because the date comes from the Git history, your CI build must check out the **full** commit history.
458
+ With `actions/checkout <https://github.com/actions/checkout>`__, set ``fetch-depth: 0``:
459
+
460
+ .. code-block:: yaml
461
+ :caption: .github/workflows/ci.yaml
462
+
463
+ - uses: actions/checkout@v6
464
+ with:
465
+ fetch-depth: 0
466
+
467
+ A shallow clone (the default) only fetches the most recent commit, so every page would otherwise report the same, incorrect date.
468
+ To avoid publishing misleading data, Documenteer detects a shallow clone, **omits the "Last updated" timestamp from every page**, and emits a single build warning telling you to set ``fetch-depth: 0``.
469
+
429
470
  [sphinx.intersphinx]
430
471
  ====================
431
472
 
@@ -56,15 +56,15 @@ Installation
56
56
 
57
57
  .. code-block:: sh
58
58
 
59
- conda install documenteer
59
+ conda install lsst-documenteer
60
60
 
61
- To use Documenteer's configurations for specific Rubin documentation use cases, you'll need to install Documenteer with specific "extras" to bring in the necessary dependencies.
62
-
63
- To install Documenteer for technote projects:
61
+ For user guide projects:
64
62
 
65
63
  .. code-block:: sh
66
64
 
67
- conda-install lsst-documenteer-technote
65
+ conda-install lsst-documenteer-guide
66
+
67
+ *Conda distributions aren't available for technote projects at this time.*
68
68
 
69
69
  Project guides
70
70
  ==============
@@ -19,3 +19,10 @@ Sphinx extensions
19
19
 
20
20
  remote-code-block
21
21
  openapi
22
+
23
+ .. toctree::
24
+ :maxdepth: 2
25
+ :titlesonly:
26
+ :caption: Page metadata
27
+
28
+ last-updated
@@ -0,0 +1,137 @@
1
+ .. _documenteer-ext-lastmodified:
2
+
3
+ ##############################
4
+ "Last updated" page timestamps
5
+ ##############################
6
+
7
+ Documenteer's ``documenteer.ext.lastmodified`` extension adds a "This page was last modified on <date>." timestamp to the bottom of each page's article body.
8
+ The date is derived from the page's **Git commit history** rather than the filesystem modification time, which is meaningless in CI where checkouts have arbitrary timestamps.
9
+ In the user-guide preset the footer date is rendered to the **reader's** local timezone (see `Reader-localized footer date`_).
10
+ It is also the single source of truth for the page's last-modified date in the HTML ``<head>``, where it emits the same Git date as Open Graph, Dublin Core, and Schema.org metadata (see `HTML metadata`_).
11
+
12
+ The extension exposes the date to the page template in three forms:
13
+
14
+ - ``last_updated`` — the date formatted with :ref:`documenteer_last_modified_date_format <documenteer-last-modified-date-format-conf>` in the commit's own timezone offset. Sphinx emits this as the ``docbuild:last-update`` meta tag, and it is the value any theme-agnostic ``last-updated`` rendering uses.
15
+ - ``documenteer_last_modified_iso`` — the canonical UTC ISO 8601 timestamp (for example ``2024-06-01T00:00:00+00:00``).
16
+ - ``documenteer_last_modified_date`` — the UTC date as ``YYYY-MM-DD`` (for example ``2024-06-01``).
17
+
18
+ Reader-localized footer date
19
+ ============================
20
+
21
+ In the user-guide preset, Documenteer overrides pydata-sphinx-theme's ``last-updated`` component to render the footer date as a ``<time>`` element:
22
+
23
+ .. code-block:: html
24
+
25
+ <time datetime="2024-06-01T00:00:00+00:00">2024-06-01</time>
26
+
27
+ The ``datetime`` attribute carries the canonical UTC ISO 8601 timestamp, and the visible text is the UTC date as ``YYYY-MM-DD``.
28
+ A small bundled script (``rubin-last-modified.js``) then rewrites the visible text to the **reader's** local date in a long-month style, for example "June 1, 2024".
29
+ This matters because a UTC date can fall on a different calendar day than the reader's local date; localizing in the browser shows each reader the correct day.
30
+ With JavaScript disabled the element keeps its ``YYYY-MM-DD`` UTC fallback text.
31
+
32
+ .. tip::
33
+
34
+ If you use Documenteer's user-guide configuration preset, this extension is already enabled and the timestamp is shown by default.
35
+ Toggle it with the :ref:`show_last_updated <guide-project-show-last-updated>` setting in :file:`documenteer.toml`; you don't need to edit :file:`conf.py`.
36
+
37
+ How the date is computed
38
+ ========================
39
+
40
+ The timestamp is the most recent commit date across the page's own source file *and* any files it pulls in with the ``include`` or ``literalinclude`` directives.
41
+ Editing an included snippet therefore updates the timestamp on every page that uses it.
42
+
43
+ Because the date is the last *commit* date:
44
+
45
+ - Uncommitted local edits don't change it.
46
+ - A page whose source has never been committed shows no timestamp.
47
+ - Generated pages without a source document (such as the search page and general index) show no timestamp.
48
+
49
+ HTML metadata
50
+ =============
51
+
52
+ Besides the visible footer timestamp, the extension writes the **same Git commit date** into the page's HTML ``<head>`` as three machine-readable signals, so that downstream consumers all agree:
53
+
54
+ - ``<meta property="article:modified_time">`` — the `Open Graph <https://ogp.me/>`__ property used by social-media link previews.
55
+ - ``<meta name="dcterms.modified">`` — the `Dublin Core <https://www.dublincore.org/specifications/dublin-core/dcmi-terms/#modified>`__ modification date.
56
+ - A `Schema.org <https://schema.org/dateModified>`__ ``dateModified`` field inside a JSON-LD ``<script type="application/ld+json">`` block (typed as ``WebPage``).
57
+
58
+ These three head signals are expressed in **UTC** (ISO 8601, ``+00:00``), so the metadata is identical regardless of the committer's timezone — a locally-authored commit and its UTC-recorded squash-merge produce the same value.
59
+ The visible footer date, by contrast, reflects the commit's own offset.
60
+
61
+ In addition, pydata-sphinx-theme renders a ``<meta name="docbuild:last-update">`` tag from the same ``last_updated`` context value.
62
+
63
+ .. note::
64
+
65
+ sphinx-sitemap (enabled by the user-guide preset) auto-loads `sphinx-last-updated-by-git <https://github.com/mgeier/sphinx-last-updated-by-git>`__ to populate the sitemap's ``<lastmod>`` entries.
66
+ That extension runs its *own* Git computation and would otherwise emit a second, potentially divergent ``article:modified_time`` tag.
67
+ To keep this extension the single source of truth, the user-guide preset sets ``git_last_updated_metatags = False``, which silences the duplicate Open Graph tag while leaving the sitemap behavior intact.
68
+
69
+ Full Git history is required
70
+ ============================
71
+
72
+ The date comes from Git, so the build must have the **full** commit history.
73
+
74
+ .. important::
75
+
76
+ With `actions/checkout <https://github.com/actions/checkout>`__, set ``fetch-depth: 0``:
77
+
78
+ .. code-block:: yaml
79
+ :caption: .github/workflows/ci.yaml
80
+
81
+ - uses: actions/checkout@v6
82
+ with:
83
+ fetch-depth: 0
84
+
85
+ A shallow clone (the default) only fetches the most recent commit, so every page would otherwise report the same, incorrect date.
86
+ To avoid publishing misleading data, Documenteer detects a shallow clone, omits the timestamp from every page, and emits a single build warning.
87
+
88
+ Reference
89
+ =========
90
+
91
+ Extension module
92
+ ----------------
93
+
94
+ The user-guide configuration preset enables this extension automatically.
95
+ To use it in a standalone Sphinx project, add ``"documenteer.ext.lastmodified"`` to the extensions list in :file:`conf.py` and render the ``last_updated`` context value.
96
+ With pydata-sphinx-theme, add the ``last-updated`` component to the article footer:
97
+
98
+ .. code-block:: python
99
+ :caption: conf.py
100
+
101
+ extensions = ["documenteer.ext.lastmodified", ...]
102
+
103
+ html_theme = "pydata_sphinx_theme"
104
+ html_theme_options = {
105
+ "article_footer_items": ["last-updated"],
106
+ }
107
+
108
+ Configurations
109
+ --------------
110
+
111
+ Set these configurations in the Sphinx :file:`conf.py` file.
112
+
113
+ .. _documenteer-last-modified-enabled-conf:
114
+
115
+ documenteer\_last\_modified\_enabled
116
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
117
+
118
+ Whether to compute and show the "Last updated" timestamp.
119
+ A boolean that defaults to `True`.
120
+ In the user-guide preset this is set automatically from the :ref:`show_last_updated <guide-project-show-last-updated>` field in :file:`documenteer.toml`.
121
+
122
+ .. _documenteer-last-modified-date-format-conf:
123
+
124
+ documenteer\_last\_modified\_date\_format
125
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
126
+
127
+ The ``strftime``-style format string for the ``last_updated`` value.
128
+ Defaults to ``"%b %d, %Y"`` (for example, ``Jun 16, 2026``).
129
+ The date is formatted with Sphinx's date machinery, so it respects the build's ``language`` setting.
130
+
131
+ This format governs the ``last_updated`` context value — the ``docbuild:last-update`` meta tag and any theme-agnostic ``last-updated`` rendering — **not** the visible footer date in the user-guide preset.
132
+ That footer date is rendered from the UTC ISO timestamp and localized to the reader's timezone by JavaScript (see `Reader-localized footer date`_), so it is not affected by this setting.
133
+
134
+ .. code-block:: python
135
+ :caption: conf.py
136
+
137
+ documenteer_last_modified_date_format = "%Y-%m-%d"
@@ -16,7 +16,7 @@ A short description of this document.
16
16
 
17
17
  ## Build this technical note
18
18
 
19
- You can clone this repository and build the technote locally if your system has Python 3.11 or later:
19
+ You can clone this repository and build the technote locally if your system has Python 3.12 or later:
20
20
 
21
21
  ```bash
22
22
  git clone https://github.com/lsst/example-000
@@ -22,7 +22,7 @@ A short description of this document.
22
22
  Build this technical note
23
23
  =========================
24
24
 
25
- You can clone this repository and build the technote locally if your system has Python 3.11 or later:
25
+ You can clone this repository and build the technote locally if your system has Python 3.12 or later:
26
26
 
27
27
  .. code-block:: bash
28
28