From 85f58874ecd9feb391e24f9d0197bef5cc637a87 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Mon, 3 May 2021 13:48:17 +0900 Subject: [PATCH] Support jinja2-3.0 Since jinja2-3.0, some utility functions like contextfunction and environmentfilter are renamed to new name. This follows the updates to support jinja2-3.0 or above. --- CHANGES | 2 ++ setup.py | 3 +-- sphinx/jinja2glue.py | 13 +++++++++---- sphinx/util/rst.py | 10 ++++++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index ce70aeb83c4..c9f0c4556c8 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,8 @@ Release 4.1.0 (in development) Dependencies ------------ +* Support jinja2-3.0 + Incompatible changes -------------------- diff --git a/setup.py b/setup.py index 7ce37f9eaf8..b669afc00e3 100644 --- a/setup.py +++ b/setup.py @@ -21,8 +21,7 @@ 'sphinxcontrib-htmlhelp', 'sphinxcontrib-serializinghtml', 'sphinxcontrib-qthelp', - 'Jinja2>=2.3,<3.0', - 'MarkupSafe<2.0', + 'Jinja2>=2.3', 'Pygments>=2.0', 'docutils>=0.14,<0.18', 'snowballstemmer>=1.1', diff --git a/sphinx/jinja2glue.py b/sphinx/jinja2glue.py index c239f5a4a1d..cd6e8066b94 100644 --- a/sphinx/jinja2glue.py +++ b/sphinx/jinja2glue.py @@ -12,7 +12,7 @@ from pprint import pformat from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Tuple, Union -from jinja2 import BaseLoader, FileSystemLoader, TemplateNotFound, contextfunction +from jinja2 import BaseLoader, FileSystemLoader, TemplateNotFound from jinja2.environment import Environment from jinja2.sandbox import SandboxedEnvironment from jinja2.utils import open_if_exists @@ -22,6 +22,11 @@ from sphinx.util import logging from sphinx.util.osutil import mtimes_of_files +try: + from jinja2.utils import pass_context # type: ignore # jinja2-3.0 or above +except ImportError: + from jinja2 import contextfunction as pass_context + if TYPE_CHECKING: from sphinx.builders import Builder @@ -101,7 +106,7 @@ def __next__(self) -> int: next = __next__ # Python 2/Jinja compatibility -@contextfunction +@pass_context def warning(context: Dict, message: str, *args: Any, **kwargs: Any) -> str: if 'pagename' in context: filename = context.get('pagename') + context.get('file_suffix', '') @@ -180,9 +185,9 @@ def init(self, builder: "Builder", theme: Theme = None, dirs: List[str] = None) self.environment.filters['toint'] = _toint self.environment.filters['todim'] = _todim self.environment.filters['slice_index'] = _slice_index - self.environment.globals['debug'] = contextfunction(pformat) + self.environment.globals['debug'] = pass_context(pformat) self.environment.globals['warning'] = warning - self.environment.globals['accesskey'] = contextfunction(accesskey) + self.environment.globals['accesskey'] = pass_context(accesskey) self.environment.globals['idgen'] = idgen if use_i18n: self.environment.install_gettext_translations(builder.app.translator) diff --git a/sphinx/util/rst.py b/sphinx/util/rst.py index 82b3f6bdaab..8103a8b109a 100644 --- a/sphinx/util/rst.py +++ b/sphinx/util/rst.py @@ -18,11 +18,17 @@ from docutils.parsers.rst.languages import en as english from docutils.statemachine import StringList from docutils.utils import Reporter -from jinja2 import Environment, environmentfilter +from jinja2 import Environment from sphinx.locale import __ from sphinx.util import docutils, logging +try: + from jinja2.utils import pass_environment # type: ignore # jinja2-3.0 or above +except ImportError: + from jinja2 import environmentfilter as pass_environment + + logger = logging.getLogger(__name__) docinfo_re = re.compile(':\\w+:.*?') @@ -51,7 +57,7 @@ def charwidth(char: str, widechars: str) -> int: return sum(charwidth(c, widechars) for c in text) -@environmentfilter +@pass_environment def heading(env: Environment, text: str, level: int = 1) -> str: """Create a heading for *level*.""" assert level <= 3