Sphinx 7.2.6__py3-none-any.whl → 7.3.0__py3-none-any.whl

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.

Potentially problematic release.


This version of Sphinx might be problematic. Click here for more details.

Files changed (388) hide show
  1. sphinx/__init__.py +8 -9
  2. sphinx/addnodes.py +31 -28
  3. sphinx/application.py +9 -15
  4. sphinx/builders/__init__.py +5 -6
  5. sphinx/builders/_epub_base.py +17 -9
  6. sphinx/builders/changes.py +10 -5
  7. sphinx/builders/dirhtml.py +4 -2
  8. sphinx/builders/dummy.py +3 -2
  9. sphinx/builders/epub3.py +5 -3
  10. sphinx/builders/gettext.py +24 -7
  11. sphinx/builders/html/__init__.py +88 -96
  12. sphinx/builders/html/_assets.py +16 -16
  13. sphinx/builders/html/transforms.py +4 -2
  14. sphinx/builders/latex/__init__.py +40 -33
  15. sphinx/builders/latex/nodes.py +6 -2
  16. sphinx/builders/latex/transforms.py +17 -8
  17. sphinx/builders/latex/util.py +1 -1
  18. sphinx/builders/linkcheck.py +86 -27
  19. sphinx/builders/manpage.py +8 -6
  20. sphinx/builders/singlehtml.py +5 -4
  21. sphinx/builders/texinfo.py +18 -14
  22. sphinx/builders/text.py +3 -2
  23. sphinx/builders/xml.py +5 -2
  24. sphinx/cmd/build.py +119 -76
  25. sphinx/cmd/make_mode.py +4 -9
  26. sphinx/cmd/quickstart.py +13 -16
  27. sphinx/config.py +432 -250
  28. sphinx/deprecation.py +23 -13
  29. sphinx/directives/__init__.py +8 -8
  30. sphinx/directives/code.py +7 -7
  31. sphinx/directives/other.py +23 -13
  32. sphinx/directives/patches.py +7 -6
  33. sphinx/domains/__init__.py +2 -2
  34. sphinx/domains/c/__init__.py +796 -0
  35. sphinx/domains/c/_ast.py +1421 -0
  36. sphinx/domains/c/_ids.py +65 -0
  37. sphinx/domains/c/_parser.py +1048 -0
  38. sphinx/domains/c/_symbol.py +700 -0
  39. sphinx/domains/changeset.py +11 -7
  40. sphinx/domains/citation.py +5 -2
  41. sphinx/domains/cpp/__init__.py +1089 -0
  42. sphinx/domains/cpp/_ast.py +3635 -0
  43. sphinx/domains/cpp/_ids.py +537 -0
  44. sphinx/domains/cpp/_parser.py +2117 -0
  45. sphinx/domains/cpp/_symbol.py +1092 -0
  46. sphinx/domains/index.py +6 -4
  47. sphinx/domains/javascript.py +16 -13
  48. sphinx/domains/math.py +9 -4
  49. sphinx/domains/python/__init__.py +890 -0
  50. sphinx/domains/python/_annotations.py +507 -0
  51. sphinx/domains/python/_object.py +426 -0
  52. sphinx/domains/rst.py +12 -7
  53. sphinx/domains/{std.py → std/__init__.py} +19 -16
  54. sphinx/environment/__init__.py +21 -19
  55. sphinx/environment/adapters/indexentries.py +2 -2
  56. sphinx/environment/adapters/toctree.py +10 -9
  57. sphinx/environment/collectors/__init__.py +6 -3
  58. sphinx/environment/collectors/asset.py +4 -3
  59. sphinx/environment/collectors/dependencies.py +3 -2
  60. sphinx/environment/collectors/metadata.py +6 -5
  61. sphinx/environment/collectors/title.py +3 -2
  62. sphinx/environment/collectors/toctree.py +5 -4
  63. sphinx/errors.py +13 -2
  64. sphinx/events.py +14 -9
  65. sphinx/ext/apidoc.py +9 -11
  66. sphinx/ext/autodoc/__init__.py +105 -71
  67. sphinx/ext/autodoc/directive.py +7 -6
  68. sphinx/ext/autodoc/importer.py +102 -36
  69. sphinx/ext/autodoc/mock.py +7 -5
  70. sphinx/ext/autodoc/preserve_defaults.py +4 -3
  71. sphinx/ext/autodoc/type_comment.py +2 -1
  72. sphinx/ext/autodoc/typehints.py +5 -4
  73. sphinx/ext/autosectionlabel.py +3 -2
  74. sphinx/ext/autosummary/__init__.py +21 -17
  75. sphinx/ext/autosummary/generate.py +9 -9
  76. sphinx/ext/coverage.py +26 -20
  77. sphinx/ext/doctest.py +38 -33
  78. sphinx/ext/duration.py +1 -0
  79. sphinx/ext/extlinks.py +4 -3
  80. sphinx/ext/githubpages.py +3 -2
  81. sphinx/ext/graphviz.py +10 -7
  82. sphinx/ext/ifconfig.py +5 -5
  83. sphinx/ext/imgconverter.py +6 -5
  84. sphinx/ext/imgmath.py +9 -8
  85. sphinx/ext/inheritance_diagram.py +31 -31
  86. sphinx/ext/intersphinx.py +140 -23
  87. sphinx/ext/linkcode.py +3 -2
  88. sphinx/ext/mathjax.py +2 -1
  89. sphinx/ext/napoleon/__init__.py +12 -7
  90. sphinx/ext/napoleon/docstring.py +34 -32
  91. sphinx/ext/todo.py +10 -7
  92. sphinx/ext/viewcode.py +12 -11
  93. sphinx/extension.py +18 -8
  94. sphinx/highlighting.py +39 -20
  95. sphinx/io.py +17 -8
  96. sphinx/jinja2glue.py +16 -15
  97. sphinx/locale/__init__.py +30 -23
  98. sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
  99. sphinx/locale/ar/LC_MESSAGES/sphinx.po +818 -761
  100. sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
  101. sphinx/locale/bg/LC_MESSAGES/sphinx.po +811 -754
  102. sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
  103. sphinx/locale/bn/LC_MESSAGES/sphinx.po +835 -778
  104. sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
  105. sphinx/locale/ca/LC_MESSAGES/sphinx.po +864 -807
  106. sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
  107. sphinx/locale/cak/LC_MESSAGES/sphinx.po +816 -759
  108. sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
  109. sphinx/locale/cs/LC_MESSAGES/sphinx.po +837 -780
  110. sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
  111. sphinx/locale/cy/LC_MESSAGES/sphinx.po +819 -762
  112. sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
  113. sphinx/locale/da/LC_MESSAGES/sphinx.po +838 -781
  114. sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
  115. sphinx/locale/de/LC_MESSAGES/sphinx.po +838 -781
  116. sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
  117. sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +811 -754
  118. sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
  119. sphinx/locale/el/LC_MESSAGES/sphinx.po +853 -796
  120. sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
  121. sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +811 -754
  122. sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
  123. sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +811 -754
  124. sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
  125. sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +856 -799
  126. sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
  127. sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +811 -754
  128. sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
  129. sphinx/locale/eo/LC_MESSAGES/sphinx.po +820 -763
  130. sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
  131. sphinx/locale/es/LC_MESSAGES/sphinx.po +856 -799
  132. sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
  133. sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +811 -754
  134. sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
  135. sphinx/locale/et/LC_MESSAGES/sphinx.po +845 -788
  136. sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
  137. sphinx/locale/eu/LC_MESSAGES/sphinx.po +837 -780
  138. sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
  139. sphinx/locale/fa/LC_MESSAGES/sphinx.po +854 -797
  140. sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
  141. sphinx/locale/fi/LC_MESSAGES/sphinx.po +816 -759
  142. sphinx/locale/fr/LC_MESSAGES/sphinx.js +1 -1
  143. sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
  144. sphinx/locale/fr/LC_MESSAGES/sphinx.po +904 -847
  145. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
  146. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +811 -754
  147. sphinx/locale/gl/LC_MESSAGES/sphinx.js +54 -54
  148. sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
  149. sphinx/locale/gl/LC_MESSAGES/sphinx.po +1506 -1449
  150. sphinx/locale/he/LC_MESSAGES/sphinx.js +1 -1
  151. sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
  152. sphinx/locale/he/LC_MESSAGES/sphinx.po +823 -766
  153. sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
  154. sphinx/locale/hi/LC_MESSAGES/sphinx.po +853 -796
  155. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
  156. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +811 -754
  157. sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
  158. sphinx/locale/hr/LC_MESSAGES/sphinx.po +844 -787
  159. sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
  160. sphinx/locale/hu/LC_MESSAGES/sphinx.po +837 -780
  161. sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
  162. sphinx/locale/id/LC_MESSAGES/sphinx.po +854 -797
  163. sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
  164. sphinx/locale/is/LC_MESSAGES/sphinx.po +811 -754
  165. sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
  166. sphinx/locale/it/LC_MESSAGES/sphinx.po +837 -780
  167. sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
  168. sphinx/locale/ja/LC_MESSAGES/sphinx.po +853 -796
  169. sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
  170. sphinx/locale/ka/LC_MESSAGES/sphinx.po +848 -791
  171. sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
  172. sphinx/locale/ko/LC_MESSAGES/sphinx.po +855 -798
  173. sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
  174. sphinx/locale/lt/LC_MESSAGES/sphinx.po +837 -780
  175. sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
  176. sphinx/locale/lv/LC_MESSAGES/sphinx.po +837 -780
  177. sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
  178. sphinx/locale/mk/LC_MESSAGES/sphinx.po +825 -768
  179. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +27 -27
  180. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
  181. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +876 -818
  182. sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
  183. sphinx/locale/ne/LC_MESSAGES/sphinx.po +837 -780
  184. sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
  185. sphinx/locale/nl/LC_MESSAGES/sphinx.po +844 -787
  186. sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
  187. sphinx/locale/pl/LC_MESSAGES/sphinx.po +845 -788
  188. sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
  189. sphinx/locale/pt/LC_MESSAGES/sphinx.po +811 -754
  190. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
  191. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +908 -851
  192. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
  193. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +837 -780
  194. sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
  195. sphinx/locale/ro/LC_MESSAGES/sphinx.po +837 -780
  196. sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
  197. sphinx/locale/ru/LC_MESSAGES/sphinx.po +838 -781
  198. sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
  199. sphinx/locale/si/LC_MESSAGES/sphinx.po +823 -766
  200. sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
  201. sphinx/locale/sk/LC_MESSAGES/sphinx.po +854 -797
  202. sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
  203. sphinx/locale/sl/LC_MESSAGES/sphinx.po +832 -775
  204. sphinx/locale/sphinx.pot +813 -755
  205. sphinx/locale/sq/LC_MESSAGES/sphinx.js +1 -1
  206. sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
  207. sphinx/locale/sq/LC_MESSAGES/sphinx.po +865 -808
  208. sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
  209. sphinx/locale/sr/LC_MESSAGES/sphinx.po +835 -778
  210. sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
  211. sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
  212. sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
  213. sphinx/locale/sv/LC_MESSAGES/sphinx.po +837 -780
  214. sphinx/locale/ta/LC_MESSAGES/sphinx.js +54 -54
  215. sphinx/locale/ta/LC_MESSAGES/sphinx.mo +0 -0
  216. sphinx/locale/ta/LC_MESSAGES/sphinx.po +1530 -1473
  217. sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
  218. sphinx/locale/te/LC_MESSAGES/sphinx.po +811 -754
  219. sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
  220. sphinx/locale/tr/LC_MESSAGES/sphinx.po +853 -796
  221. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
  222. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +833 -776
  223. sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
  224. sphinx/locale/ur/LC_MESSAGES/sphinx.po +811 -754
  225. sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
  226. sphinx/locale/vi/LC_MESSAGES/sphinx.po +837 -780
  227. sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
  228. sphinx/locale/yue/LC_MESSAGES/sphinx.po +811 -754
  229. sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mo +0 -0
  230. sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po +855 -798
  231. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
  232. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +811 -754
  233. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +1 -1
  234. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
  235. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +879 -822
  236. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
  237. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +811 -754
  238. sphinx/parsers.py +7 -5
  239. sphinx/project.py +18 -11
  240. sphinx/pycode/__init__.py +6 -5
  241. sphinx/pycode/ast.py +23 -8
  242. sphinx/pycode/parser.py +6 -5
  243. sphinx/registry.py +12 -6
  244. sphinx/roles.py +103 -57
  245. sphinx/search/__init__.py +17 -18
  246. sphinx/search/da.py +2 -2
  247. sphinx/search/de.py +2 -2
  248. sphinx/search/en.py +1 -1
  249. sphinx/search/es.py +2 -2
  250. sphinx/search/fi.py +2 -2
  251. sphinx/search/fr.py +2 -2
  252. sphinx/search/hu.py +2 -2
  253. sphinx/search/it.py +2 -2
  254. sphinx/search/ja.py +13 -22
  255. sphinx/search/nl.py +2 -2
  256. sphinx/search/no.py +2 -2
  257. sphinx/search/pt.py +2 -2
  258. sphinx/search/ro.py +1 -1
  259. sphinx/search/ru.py +2 -2
  260. sphinx/search/sv.py +2 -2
  261. sphinx/search/tr.py +1 -1
  262. sphinx/search/zh.py +2 -3
  263. sphinx/templates/graphviz/graphviz.css +1 -1
  264. sphinx/testing/fixtures.py +41 -24
  265. sphinx/testing/path.py +1 -1
  266. sphinx/testing/util.py +142 -53
  267. sphinx/texinputs/sphinx.xdy +1 -1
  268. sphinx/texinputs/sphinxlatextables.sty +1 -1
  269. sphinx/texinputs/sphinxpackagesubstitutefont.sty +21 -0
  270. sphinx/themes/agogo/layout.html +4 -4
  271. sphinx/themes/agogo/static/agogo.css_t +1 -1
  272. sphinx/themes/agogo/theme.toml +22 -0
  273. sphinx/themes/basic/defindex.html +1 -1
  274. sphinx/themes/basic/domainindex.html +1 -1
  275. sphinx/themes/basic/genindex-single.html +1 -1
  276. sphinx/themes/basic/genindex-split.html +1 -1
  277. sphinx/themes/basic/genindex.html +1 -1
  278. sphinx/themes/basic/globaltoc.html +1 -1
  279. sphinx/themes/basic/layout.html +1 -1
  280. sphinx/themes/basic/localtoc.html +1 -1
  281. sphinx/themes/basic/page.html +1 -1
  282. sphinx/themes/basic/relations.html +1 -1
  283. sphinx/themes/basic/search.html +5 -20
  284. sphinx/themes/basic/searchbox.html +3 -3
  285. sphinx/themes/basic/searchfield.html +3 -3
  286. sphinx/themes/basic/sourcelink.html +1 -1
  287. sphinx/themes/basic/static/basic.css_t +1 -1
  288. sphinx/themes/basic/static/doctools.js +1 -1
  289. sphinx/themes/basic/static/language_data.js_t +2 -2
  290. sphinx/themes/basic/static/searchtools.js +105 -60
  291. sphinx/themes/basic/theme.toml +23 -0
  292. sphinx/themes/bizstyle/layout.html +1 -6
  293. sphinx/themes/bizstyle/static/bizstyle.css_t +1 -1
  294. sphinx/themes/bizstyle/static/bizstyle.js_t +1 -1
  295. sphinx/themes/bizstyle/static/css3-mediaqueries_src.js +3 -3
  296. sphinx/themes/bizstyle/theme.toml +12 -0
  297. sphinx/themes/classic/layout.html +1 -1
  298. sphinx/themes/classic/static/classic.css_t +1 -1
  299. sphinx/themes/classic/static/sidebar.js_t +1 -1
  300. sphinx/themes/classic/theme.toml +34 -0
  301. sphinx/themes/default/theme.toml +2 -0
  302. sphinx/themes/epub/epub-cover.html +1 -1
  303. sphinx/themes/epub/layout.html +1 -1
  304. sphinx/themes/epub/static/epub.css_t +1 -1
  305. sphinx/themes/epub/theme.toml +10 -0
  306. sphinx/themes/haiku/layout.html +3 -3
  307. sphinx/themes/haiku/static/haiku.css_t +2 -2
  308. sphinx/themes/haiku/theme.toml +16 -0
  309. sphinx/themes/nature/static/nature.css_t +1 -1
  310. sphinx/themes/nature/theme.toml +6 -0
  311. sphinx/themes/nonav/layout.html +1 -1
  312. sphinx/themes/nonav/static/nonav.css_t +1 -1
  313. sphinx/themes/nonav/theme.toml +10 -0
  314. sphinx/themes/pyramid/static/epub.css_t +1 -1
  315. sphinx/themes/pyramid/static/pyramid.css_t +1 -1
  316. sphinx/themes/pyramid/theme.toml +6 -0
  317. sphinx/themes/scrolls/artwork/logo.svg +1 -1
  318. sphinx/themes/scrolls/layout.html +2 -2
  319. sphinx/themes/scrolls/static/scrolls.css_t +1 -1
  320. sphinx/themes/scrolls/theme.toml +15 -0
  321. sphinx/themes/sphinxdoc/static/sphinxdoc.css_t +1 -1
  322. sphinx/themes/sphinxdoc/theme.toml +6 -0
  323. sphinx/themes/traditional/static/traditional.css_t +1 -1
  324. sphinx/themes/traditional/theme.toml +9 -0
  325. sphinx/theming.py +427 -131
  326. sphinx/transforms/__init__.py +21 -24
  327. sphinx/transforms/compact_bullet_list.py +5 -5
  328. sphinx/transforms/i18n.py +30 -28
  329. sphinx/transforms/post_transforms/__init__.py +9 -7
  330. sphinx/transforms/post_transforms/code.py +4 -1
  331. sphinx/transforms/post_transforms/images.py +17 -13
  332. sphinx/transforms/references.py +3 -1
  333. sphinx/util/__init__.py +15 -11
  334. sphinx/util/_io.py +34 -0
  335. sphinx/util/_pathlib.py +23 -18
  336. sphinx/util/build_phase.py +1 -0
  337. sphinx/util/cfamily.py +19 -11
  338. sphinx/util/console.py +101 -21
  339. sphinx/util/display.py +3 -2
  340. sphinx/util/docfields.py +12 -8
  341. sphinx/util/docutils.py +21 -35
  342. sphinx/util/exceptions.py +3 -2
  343. sphinx/util/fileutil.py +5 -5
  344. sphinx/util/http_date.py +9 -2
  345. sphinx/util/i18n.py +40 -9
  346. sphinx/util/inspect.py +317 -245
  347. sphinx/util/inventory.py +22 -5
  348. sphinx/util/logging.py +81 -7
  349. sphinx/util/matching.py +2 -1
  350. sphinx/util/math.py +1 -2
  351. sphinx/util/nodes.py +39 -29
  352. sphinx/util/osutil.py +25 -6
  353. sphinx/util/parallel.py +6 -1
  354. sphinx/util/requests.py +8 -5
  355. sphinx/util/rst.py +8 -6
  356. sphinx/util/tags.py +3 -3
  357. sphinx/util/template.py +8 -3
  358. sphinx/util/typing.py +76 -42
  359. sphinx/versioning.py +6 -2
  360. sphinx/writers/html.py +1 -1
  361. sphinx/writers/html5.py +17 -13
  362. sphinx/writers/latex.py +12 -12
  363. sphinx/writers/manpage.py +13 -7
  364. sphinx/writers/texinfo.py +13 -10
  365. sphinx/writers/text.py +13 -23
  366. sphinx/writers/xml.py +1 -1
  367. sphinx-7.2.6.dist-info/LICENSE → sphinx-7.3.0.dist-info/LICENSE.rst +1 -1
  368. {sphinx-7.2.6.dist-info → sphinx-7.3.0.dist-info}/METADATA +13 -12
  369. sphinx-7.3.0.dist-info/RECORD +581 -0
  370. sphinx/domains/c.py +0 -3906
  371. sphinx/domains/cpp.py +0 -8233
  372. sphinx/domains/python.py +0 -1769
  373. sphinx/themes/agogo/theme.conf +0 -20
  374. sphinx/themes/basic/theme.conf +0 -16
  375. sphinx/themes/bizstyle/theme.conf +0 -10
  376. sphinx/themes/classic/theme.conf +0 -32
  377. sphinx/themes/default/theme.conf +0 -2
  378. sphinx/themes/epub/theme.conf +0 -8
  379. sphinx/themes/haiku/theme.conf +0 -14
  380. sphinx/themes/nature/theme.conf +0 -4
  381. sphinx/themes/nonav/theme.conf +0 -8
  382. sphinx/themes/pyramid/theme.conf +0 -4
  383. sphinx/themes/scrolls/theme.conf +0 -13
  384. sphinx/themes/sphinxdoc/theme.conf +0 -4
  385. sphinx/themes/traditional/theme.conf +0 -7
  386. sphinx-7.2.6.dist-info/RECORD +0 -569
  387. {sphinx-7.2.6.dist-info → sphinx-7.3.0.dist-info}/WHEEL +0 -0
  388. {sphinx-7.2.6.dist-info → sphinx-7.3.0.dist-info}/entry_points.txt +0 -0
sphinx/cmd/build.py CHANGED
@@ -21,19 +21,19 @@ from sphinx import __display_version__
21
21
  from sphinx.application import Sphinx
22
22
  from sphinx.errors import SphinxError, SphinxParallelError
23
23
  from sphinx.locale import __
24
- from sphinx.util import Tee
25
- from sphinx.util.console import ( # type: ignore[attr-defined]
26
- color_terminal,
27
- nocolor,
28
- red,
29
- terminal_safe,
30
- )
24
+ from sphinx.util._io import TeeStripANSI
25
+ from sphinx.util.console import color_terminal, nocolor, red, terminal_safe
31
26
  from sphinx.util.docutils import docutils_namespace, patch_docutils
32
27
  from sphinx.util.exceptions import format_exception_cut_frames, save_traceback
33
28
  from sphinx.util.osutil import ensuredir
34
29
 
35
30
  if TYPE_CHECKING:
36
31
  from collections.abc import Sequence
32
+ from typing import Protocol
33
+
34
+ class SupportsWrite(Protocol):
35
+ def write(self, text: str, /) -> int | None:
36
+ ...
37
37
 
38
38
 
39
39
  def handle_exception(
@@ -133,75 +133,79 @@ files can be built by specifying individual filenames.
133
133
  """))
134
134
 
135
135
  parser.add_argument('--version', action='version', dest='show_version',
136
- version='%%(prog)s %s' % __display_version__)
136
+ version=f'%(prog)s {__display_version__}')
137
137
 
138
- parser.add_argument('sourcedir',
138
+ parser.add_argument('sourcedir', metavar='SOURCE_DIR',
139
139
  help=__('path to documentation source files'))
140
- parser.add_argument('outputdir',
140
+ parser.add_argument('outputdir', metavar='OUTPUT_DIR',
141
141
  help=__('path to output directory'))
142
142
  parser.add_argument('filenames', nargs='*',
143
- help=__('a list of specific files to rebuild. Ignored '
144
- 'if -a is specified'))
143
+ help=__('(optional) a list of specific files to rebuild. '
144
+ 'Ignored if --write-all is specified'))
145
145
 
146
146
  group = parser.add_argument_group(__('general options'))
147
- group.add_argument('-b', metavar='BUILDER', dest='builder',
147
+ group.add_argument('--builder', '-b', metavar='BUILDER', dest='builder',
148
148
  default='html',
149
- help=__('builder to use (default: html)'))
150
- group.add_argument('-a', action='store_true', dest='force_all',
149
+ help=__("builder to use (default: 'html')"))
150
+ group.add_argument('--jobs', '-j', metavar='N', default=1, type=jobs_argument,
151
+ dest='jobs',
152
+ help=__('run in parallel with N processes, when possible. '
153
+ "'auto' uses the number of CPU cores"))
154
+ group.add_argument('--write-all', '-a', action='store_true', dest='force_all',
151
155
  help=__('write all files (default: only write new and '
152
156
  'changed files)'))
153
- group.add_argument('-E', action='store_true', dest='freshenv',
157
+ group.add_argument('--fresh-env', '-E', action='store_true', dest='freshenv',
154
158
  help=__("don't use a saved environment, always read "
155
159
  'all files'))
156
- group.add_argument('-d', metavar='PATH', dest='doctreedir',
157
- help=__('path for the cached environment and doctree '
158
- 'files (default: OUTPUTDIR/.doctrees)'))
159
- group.add_argument('-j', '--jobs', metavar='N', default=1, type=jobs_argument,
160
- dest='jobs',
161
- help=__('build in parallel with N processes where '
162
- 'possible (special value "auto" will set N to cpu-count)'))
160
+
161
+ group = parser.add_argument_group(__('path options'))
162
+ group.add_argument('--doctree-dir', '-d', metavar='PATH', dest='doctreedir',
163
+ help=__('directory for doctree and environment files '
164
+ '(default: OUTPUT_DIR/.doctrees)'))
165
+ group.add_argument('--conf-dir', '-c', metavar='PATH', dest='confdir',
166
+ help=__('directory for the configuration file (conf.py) '
167
+ '(default: SOURCE_DIR)'))
168
+
163
169
  group = parser.add_argument_group('build configuration options')
164
- group.add_argument('-c', metavar='PATH', dest='confdir',
165
- help=__('path where configuration file (conf.py) is '
166
- 'located (default: same as SOURCEDIR)'))
167
- group.add_argument('-C', action='store_true', dest='noconfig',
168
- help=__('use no config file at all, only -D options'))
169
- group.add_argument('-D', metavar='setting=value', action='append',
170
+ group.add_argument('--isolated', '-C', action='store_true', dest='noconfig',
171
+ help=__('use no configuration file, only use settings from -D options'))
172
+ group.add_argument('--define', '-D', metavar='setting=value', action='append',
170
173
  dest='define', default=[],
171
174
  help=__('override a setting in configuration file'))
172
- group.add_argument('-A', metavar='name=value', action='append',
175
+ group.add_argument('--html-define', '-A', metavar='name=value', action='append',
173
176
  dest='htmldefine', default=[],
174
177
  help=__('pass a value into HTML templates'))
175
- group.add_argument('-t', metavar='TAG', action='append',
178
+ group.add_argument('--tag', '-t', metavar='TAG', action='append',
176
179
  dest='tags', default=[],
177
180
  help=__('define tag: include "only" blocks with TAG'))
178
- group.add_argument('-n', action='store_true', dest='nitpicky',
179
- help=__('nit-picky mode, warn about all missing '
180
- 'references'))
181
+ group.add_argument('--nitpicky', '-n', action='store_true', dest='nitpicky',
182
+ help=__('nit-picky mode: warn about all missing references'))
181
183
 
182
184
  group = parser.add_argument_group(__('console output options'))
183
- group.add_argument('-v', action='count', dest='verbosity', default=0,
185
+ group.add_argument('--verbose', '-v', action='count', dest='verbosity',
186
+ default=0,
184
187
  help=__('increase verbosity (can be repeated)'))
185
- group.add_argument('-q', action='store_true', dest='quiet',
188
+ group.add_argument('--quiet', '-q', action='store_true', dest='quiet',
186
189
  help=__('no output on stdout, just warnings on stderr'))
187
- group.add_argument('-Q', action='store_true', dest='really_quiet',
190
+ group.add_argument('--silent', '-Q', action='store_true', dest='really_quiet',
188
191
  help=__('no output at all, not even warnings'))
189
- group.add_argument('--color', action='store_const', const='yes',
190
- default='auto',
192
+ group.add_argument('--color', action='store_const', dest='color',
193
+ const='yes', default='auto',
191
194
  help=__('do emit colored output (default: auto-detect)'))
192
- group.add_argument('-N', '--no-color', dest='color', action='store_const',
195
+ group.add_argument('--no-color', '-N', action='store_const', dest='color',
193
196
  const='no',
194
- help=__('do not emit colored output (default: '
195
- 'auto-detect)'))
196
- group.add_argument('-w', metavar='FILE', dest='warnfile',
197
+ help=__('do not emit colored output (default: auto-detect)'))
198
+
199
+ group = parser.add_argument_group(__('warning control options'))
200
+ group.add_argument('--warning-file', '-w', metavar='FILE', dest='warnfile',
197
201
  help=__('write warnings (and errors) to given file'))
198
- group.add_argument('-W', action='store_true', dest='warningiserror',
202
+ group.add_argument('--fail-on-warning', '-W', action='store_true', dest='warningiserror',
199
203
  help=__('turn warnings into errors'))
200
204
  group.add_argument('--keep-going', action='store_true', dest='keep_going',
201
- help=__("with -W, keep going when getting warnings"))
202
- group.add_argument('-T', action='store_true', dest='traceback',
205
+ help=__("with --fail-on-warning, keep going when getting warnings"))
206
+ group.add_argument('--show-traceback', '-T', action='store_true', dest='traceback',
203
207
  help=__('show full traceback on exception'))
204
- group.add_argument('-P', action='store_true', dest='pdb',
208
+ group.add_argument('--pdb', '-P', action='store_true', dest='pdb',
205
209
  help=__('run Pdb on exception'))
206
210
 
207
211
  return parser
@@ -213,58 +217,86 @@ def make_main(argv: Sequence[str]) -> int:
213
217
  return make_mode.run_make_mode(argv[1:])
214
218
 
215
219
 
216
- def _parse_arguments(argv: Sequence[str]) -> argparse.Namespace:
217
- parser = get_parser()
220
+ def _parse_arguments(parser: argparse.ArgumentParser,
221
+ argv: Sequence[str]) -> argparse.Namespace:
218
222
  args = parser.parse_args(argv)
223
+ return args
224
+
219
225
 
220
- if args.noconfig:
221
- args.confdir = None
222
- elif not args.confdir:
223
- args.confdir = args.sourcedir
226
+ def _parse_confdir(noconfig: bool, confdir: str, sourcedir: str) -> str | None:
227
+ if noconfig:
228
+ return None
229
+ elif not confdir:
230
+ return sourcedir
231
+ return confdir
224
232
 
225
- if not args.doctreedir:
226
- args.doctreedir = os.path.join(args.outputdir, '.doctrees')
227
233
 
228
- if args.force_all and args.filenames:
234
+ def _parse_doctreedir(doctreedir: str, outputdir: str) -> str:
235
+ if doctreedir:
236
+ return doctreedir
237
+ return os.path.join(outputdir, '.doctrees')
238
+
239
+
240
+ def _validate_filenames(
241
+ parser: argparse.ArgumentParser, force_all: bool, filenames: list[str],
242
+ ) -> None:
243
+ if force_all and filenames:
229
244
  parser.error(__('cannot combine -a option and filenames'))
230
245
 
231
- if args.color == 'no' or (args.color == 'auto' and not color_terminal()):
246
+
247
+ def _validate_colour_support(colour: str) -> None:
248
+ if colour == 'no' or (colour == 'auto' and not color_terminal()):
232
249
  nocolor()
233
250
 
251
+
252
+ def _parse_logging(
253
+ parser: argparse.ArgumentParser,
254
+ quiet: bool,
255
+ really_quiet: bool,
256
+ warnfile: str | None,
257
+ ) -> tuple[TextIO | None, TextIO | None, TextIO, TextIO | None]:
234
258
  status: TextIO | None = sys.stdout
235
259
  warning: TextIO | None = sys.stderr
236
260
  error = sys.stderr
237
261
 
238
- if args.quiet:
262
+ if quiet:
239
263
  status = None
240
264
 
241
- if args.really_quiet:
265
+ if really_quiet:
242
266
  status = warning = None
243
267
 
244
- if warning and args.warnfile:
268
+ warnfp = None
269
+ if warning and warnfile:
245
270
  try:
246
- warnfile = path.abspath(args.warnfile)
271
+ warnfile = path.abspath(warnfile)
247
272
  ensuredir(path.dirname(warnfile))
248
- warnfp = open(args.warnfile, 'w', encoding="utf-8") # NoQA: SIM115
273
+ # the caller is responsible for closing this file descriptor
274
+ warnfp = open(warnfile, 'w', encoding="utf-8") # NoQA: SIM115
249
275
  except Exception as exc:
250
276
  parser.error(__('cannot open warning file %r: %s') % (
251
- args.warnfile, exc))
252
- warning = Tee(warning, warnfp) # type: ignore[assignment]
277
+ warnfile, exc))
278
+ warning = TeeStripANSI(warning, warnfp) # type: ignore[assignment]
253
279
  error = warning
254
280
 
255
- args.status = status
256
- args.warning = warning
257
- args.error = error
281
+ return status, warning, error, warnfp
258
282
 
259
- confoverrides = {}
260
- for val in args.define:
283
+
284
+ def _parse_confoverrides(
285
+ parser: argparse.ArgumentParser,
286
+ define: list[str],
287
+ htmldefine: list[str],
288
+ nitpicky: bool,
289
+ ) -> dict[str, Any]:
290
+ confoverrides: dict[str, Any] = {}
291
+ val: Any
292
+ for val in define:
261
293
  try:
262
294
  key, val = val.split('=', 1)
263
295
  except ValueError:
264
296
  parser.error(__('-D option argument must be in the form name=value'))
265
297
  confoverrides[key] = val
266
298
 
267
- for val in args.htmldefine:
299
+ for val in htmldefine:
268
300
  try:
269
301
  key, val = val.split('=')
270
302
  except ValueError:
@@ -272,19 +304,26 @@ def _parse_arguments(argv: Sequence[str]) -> argparse.Namespace:
272
304
  with contextlib.suppress(ValueError):
273
305
  val = int(val)
274
306
 
275
- confoverrides['html_context.%s' % key] = val
307
+ confoverrides[f'html_context.{key}'] = val
276
308
 
277
- if args.nitpicky:
309
+ if nitpicky:
278
310
  confoverrides['nitpicky'] = True
279
311
 
280
- args.confoverrides = confoverrides
281
-
282
- return args
312
+ return confoverrides
283
313
 
284
314
 
285
315
  def build_main(argv: Sequence[str]) -> int:
286
316
  """Sphinx build "main" command-line entry."""
287
- args = _parse_arguments(argv)
317
+ parser = get_parser()
318
+ args = _parse_arguments(parser, argv)
319
+ args.confdir = _parse_confdir(args.noconfig, args.confdir, args.sourcedir)
320
+ args.doctreedir = _parse_doctreedir(args.doctreedir, args.outputdir)
321
+ _validate_filenames(parser, args.force_all, args.filenames)
322
+ _validate_colour_support(args.color)
323
+ args.status, args.warning, args.error, warnfp = _parse_logging(
324
+ parser, args.quiet, args.really_quiet, args.warnfile)
325
+ args.confoverrides = _parse_confoverrides(
326
+ parser, args.define, args.htmldefine, args.nitpicky)
288
327
 
289
328
  app = None
290
329
  try:
@@ -300,6 +339,10 @@ def build_main(argv: Sequence[str]) -> int:
300
339
  except (Exception, KeyboardInterrupt) as exc:
301
340
  handle_exception(app, args, exc, args.error)
302
341
  return 2
342
+ finally:
343
+ if warnfp is not None:
344
+ # close the file descriptor for the warnings file opened by Sphinx
345
+ warnfp.close()
303
346
 
304
347
 
305
348
  def _bug_report_info() -> int:
sphinx/cmd/make_mode.py CHANGED
@@ -17,17 +17,12 @@ from typing import TYPE_CHECKING
17
17
 
18
18
  import sphinx
19
19
  from sphinx.cmd.build import build_main
20
- from sphinx.util.console import ( # type: ignore[attr-defined]
21
- blue,
22
- bold,
23
- color_terminal,
24
- nocolor,
25
- )
20
+ from sphinx.util.console import blue, bold, color_terminal, nocolor
26
21
  from sphinx.util.osutil import rmtree
27
22
 
28
- try:
29
- from contextlib import chdir # type: ignore[attr-defined]
30
- except ImportError:
23
+ if sys.version_info >= (3, 11):
24
+ from contextlib import chdir
25
+ else:
31
26
  from sphinx.util.osutil import _chdir as chdir
32
27
 
33
28
  if TYPE_CHECKING:
sphinx/cmd/quickstart.py CHANGED
@@ -31,13 +31,7 @@ from docutils.utils import column_width
31
31
  import sphinx.locale
32
32
  from sphinx import __display_version__, package_dir
33
33
  from sphinx.locale import __
34
- from sphinx.util.console import ( # type: ignore[attr-defined]
35
- bold,
36
- color_terminal,
37
- colorize,
38
- nocolor,
39
- red,
40
- )
34
+ from sphinx.util.console import bold, color_terminal, colorize, nocolor, red
41
35
  from sphinx.util.osutil import ensuredir
42
36
  from sphinx.util.template import SphinxRenderer
43
37
 
@@ -211,7 +205,6 @@ def ask_user(d: dict[str, Any]) -> None:
211
205
  * makefile: make Makefile
212
206
  * batchfile: make command file
213
207
  """
214
-
215
208
  print(bold(__('Welcome to the Sphinx %s quickstart utility.')) % __display_version__)
216
209
  print()
217
210
  print(__('Please enter values for the following settings (just press Enter to\n'
@@ -246,9 +239,9 @@ def ask_user(d: dict[str, Any]) -> None:
246
239
 
247
240
  if 'dot' not in d:
248
241
  print()
249
- print(__('Inside the root directory, two more directories will be created; "_templates"\n' # noqa: E501
250
- 'for custom HTML templates and "_static" for custom stylesheets and other static\n' # noqa: E501
251
- 'files. You can enter another prefix (such as ".") to replace the underscore.')) # noqa: E501
242
+ print(__('Inside the root directory, two more directories will be created; "_templates"\n' # NoQA: E501
243
+ 'for custom HTML templates and "_static" for custom stylesheets and other static\n' # NoQA: E501
244
+ 'files. You can enter another prefix (such as ".") to replace the underscore.')) # NoQA: E501
252
245
  d['dot'] = do_prompt(__('Name prefix for templates and static dir'), '_', ok)
253
246
 
254
247
  if 'project' not in d:
@@ -396,10 +389,13 @@ def generate(
396
389
  else:
397
390
  write_file(masterfile, template.render('quickstart/root_doc.rst_t', d))
398
391
 
399
- if d.get('make_mode') is True:
392
+ if d.get('make_mode'):
400
393
  makefile_template = 'quickstart/Makefile.new_t'
401
394
  batchfile_template = 'quickstart/make.bat.new_t'
402
395
  else:
396
+ # xref RemovedInSphinx80Warning
397
+ msg = "Support for '--no-use-make-mode' will be removed in Sphinx 8."
398
+ print(colorize('red', msg))
403
399
  makefile_template = 'quickstart/Makefile_t'
404
400
  batchfile_template = 'quickstart/make.bat_t'
405
401
 
@@ -432,6 +428,10 @@ def generate(
432
428
  print(__('where "builder" is one of the supported builders, '
433
429
  'e.g. html, latex or linkcheck.'))
434
430
  print()
431
+ if not d.get('make_mode'):
432
+ # xref RemovedInSphinx80Warning
433
+ msg = "Support for '--no-use-make-mode' will be removed in Sphinx 8."
434
+ print(colorize('red', msg))
435
435
 
436
436
 
437
437
  def valid_dir(d: dict) -> bool:
@@ -457,10 +457,7 @@ def valid_dir(d: dict) -> bool:
457
457
  d['dot'] + 'templates',
458
458
  d['master'] + d['suffix'],
459
459
  ]
460
- if set(reserved_names) & set(os.listdir(dir)):
461
- return False
462
-
463
- return True
460
+ return not set(reserved_names) & set(os.listdir(dir))
464
461
 
465
462
 
466
463
  def get_parser() -> argparse.ArgumentParser: