Require Docutils 0.20 or greater (#12555)

This commit is contained in:
Adam Turner 2024-07-13 08:20:13 +01:00 committed by GitHub
parent 063c97304d
commit d2f426637d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 13 additions and 55 deletions

View File

@ -38,14 +38,12 @@ jobs:
- "3.12" - "3.12"
- "3.13-dev" - "3.13-dev"
docutils: docutils:
- "0.18" - "0.20"
- "0.21" - "0.21"
include: # include:
# test every supported Docutils version for the latest supported Python # # test every supported Docutils version for the latest supported Python
- python: "3.12" # - python: "3.12"
docutils: "0.19" # docutils: "0.20"
- python: "3.12"
docutils: "0.20"
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View File

@ -4,6 +4,9 @@ Release 7.4.0 (in development)
Dependencies Dependencies
------------ ------------
* #12555: Drop Docutils 0.18.1 and Docutils 0.19 support.
Patch by Adam Turner
Incompatible changes Incompatible changes
-------------------- --------------------

View File

@ -64,7 +64,7 @@ dependencies = [
"sphinxcontrib-qthelp", "sphinxcontrib-qthelp",
"Jinja2>=3.0", "Jinja2>=3.0",
"Pygments>=2.14", "Pygments>=2.14",
"docutils>=0.18.1,<0.22", "docutils>=0.20,<0.22",
"snowballstemmer>=2.0", "snowballstemmer>=2.0",
"babel>=2.9", "babel>=2.9",
"alabaster~=0.7.14", "alabaster~=0.7.14",

View File

@ -209,11 +209,7 @@ class StandaloneHTMLBuilder(Builder):
source_class=DocTreeInput, source_class=DocTreeInput,
destination=StringOutput(encoding='unicode'), destination=StringOutput(encoding='unicode'),
) )
if docutils.__version_info__[:2] >= (0, 19): pub.get_settings(output_encoding='unicode', traceback=True)
pub.get_settings(output_encoding='unicode', traceback=True)
else:
op = pub.setup_option_parser(output_encoding='unicode', traceback=True)
pub.settings = op.get_default_values()
self._publisher = pub self._publisher = pub
def init(self) -> None: def init(self) -> None:

View File

@ -4,8 +4,6 @@ from __future__ import annotations
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
import docutils
from docutils import nodes
from docutils.core import Publisher from docutils.core import Publisher
from docutils.io import FileInput, Input, NullOutput from docutils.io import FileInput, Input, NullOutput
from docutils.readers import standalone from docutils.readers import standalone
@ -25,6 +23,7 @@ from sphinx.util.docutils import LoggingReporter
from sphinx.versioning import UIDTransform from sphinx.versioning import UIDTransform
if TYPE_CHECKING: if TYPE_CHECKING:
from docutils import nodes
from docutils.frontend import Values from docutils.frontend import Values
from docutils.parsers import Parser from docutils.parsers import Parser
from docutils.transforms import Transform from docutils.transforms import Transform
@ -191,8 +190,5 @@ def create_publisher(app: Sphinx, filetype: str) -> Publisher:
# Propagate exceptions by default when used programmatically: # Propagate exceptions by default when used programmatically:
defaults = {'traceback': True, **app.env.settings} defaults = {'traceback': True, **app.env.settings}
# Set default settings # Set default settings
if docutils.__version_info__[:2] >= (0, 19): pub.get_settings(**defaults)
pub.get_settings(**defaults)
else:
pub.settings = pub.setup_option_parser(**defaults).get_default_values()
return pub return pub

View File

@ -17,7 +17,6 @@ from docutils.parsers.rst import Directive, directives, roles
from docutils.parsers.rst.states import Inliner # NoQA: TCH002 from docutils.parsers.rst.states import Inliner # NoQA: TCH002
from docutils.statemachine import State, StateMachine, StringList from docutils.statemachine import State, StateMachine, StringList
from docutils.utils import Reporter, unescape from docutils.utils import Reporter, unescape
from docutils.writers._html_base import HTMLTranslator
from sphinx.errors import SphinxError from sphinx.errors import SphinxError
from sphinx.locale import _, __ from sphinx.locale import _, __
@ -181,46 +180,12 @@ def using_user_docutils_conf(confdir: str | None) -> Iterator[None]:
os.environ['DOCUTILSCONFIG'] = docutilsconfig os.environ['DOCUTILSCONFIG'] = docutilsconfig
@contextmanager
def du19_footnotes() -> Iterator[None]:
def visit_footnote(self: HTMLTranslator, node: Element) -> None:
label_style = self.settings.footnote_references
if not isinstance(node.previous_sibling(), type(node)):
self.body.append(f'<aside class="footnote-list {label_style}">\n')
self.body.append(self.starttag(node, 'aside',
classes=[node.tagname, label_style],
role="note"))
def depart_footnote(self: HTMLTranslator, node: Element) -> None:
self.body.append('</aside>\n')
if not isinstance(node.next_node(descend=False, siblings=True),
type(node)):
self.body.append('</aside>\n')
old_visit_footnote = HTMLTranslator.visit_footnote
old_depart_footnote = HTMLTranslator.depart_footnote
# Only apply on Docutils 0.18 or 0.18.1, as 0.17 and earlier used a <dl> based
# approach, and 0.19 and later use the fixed approach by default.
if docutils.__version_info__[:2] == (0, 18):
HTMLTranslator.visit_footnote = visit_footnote # type: ignore[method-assign]
HTMLTranslator.depart_footnote = depart_footnote # type: ignore[method-assign]
try:
yield
finally:
if docutils.__version_info__[:2] == (0, 18):
HTMLTranslator.visit_footnote = old_visit_footnote # type: ignore[method-assign]
HTMLTranslator.depart_footnote = old_depart_footnote # type: ignore[method-assign]
@contextmanager @contextmanager
def patch_docutils(confdir: str | None = None) -> Iterator[None]: def patch_docutils(confdir: str | None = None) -> Iterator[None]:
"""Patch to docutils temporarily.""" """Patch to docutils temporarily."""
with patched_get_language(), \ with patched_get_language(), \
patched_rst_get_language(), \ patched_rst_get_language(), \
using_user_docutils_conf(confdir), \ using_user_docutils_conf(confdir):
du19_footnotes():
yield yield