👌 Make ExtensionMetadata type public and use it in internal extensions (#12153)

This type alias has now been fully documented for public consumption.

This will be beneficial to the sphinx ecosystem,
to aide/encourage extension developers to provide the correct metadata.

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
Chris Sewell
2024-03-21 16:19:26 +01:00
committed by GitHub
parent ace9d97500
commit d59b158371
75 changed files with 200 additions and 122 deletions

View File

@@ -22,6 +22,11 @@ Deprecated
Features added
--------------
* Add public type alias :class:`sphinx.util.typing.ExtensionMetadata`.
This can be used by extension developers
to annotate the return type of their ``setup`` function.
Patch by Chris Sewell.
* #12133: Allow ``external`` roles to reference object types
(rather than role names). Patch by Chris Sewell.

View File

@@ -1,6 +1,9 @@
from docutils import nodes
from docutils.parsers.rst import Directive
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
class HelloWorld(Directive):
def run(self):
@@ -8,7 +11,7 @@ class HelloWorld(Directive):
return [paragraph_node]
def setup(app):
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_directive('helloworld', HelloWorld)
return {

View File

@@ -3,10 +3,12 @@ from collections import defaultdict
from docutils.parsers.rst import directives
from sphinx import addnodes
from sphinx.application import Sphinx
from sphinx.directives import ObjectDescription
from sphinx.domains import Domain, Index
from sphinx.roles import XRefRole
from sphinx.util.nodes import make_refnode
from sphinx.util.typing import ExtensionMetadata
class RecipeDirective(ObjectDescription):
@@ -153,7 +155,7 @@ class RecipeDomain(Domain):
self.data['recipes'].append((name, signature, 'Recipe', self.env.docname, anchor, 0))
def setup(app):
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(RecipeDomain)
return {

View File

@@ -1,8 +1,10 @@
from docutils import nodes
from docutils.parsers.rst import Directive
from sphinx.application import Sphinx
from sphinx.locale import _
from sphinx.util.docutils import SphinxDirective
from sphinx.util.typing import ExtensionMetadata
class todo(nodes.Admonition, nodes.Element):
@@ -111,7 +113,7 @@ def process_todo_nodes(app, doctree, fromdocname):
node.replace_self(content)
def setup(app):
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_config_value('todo_include_todos', False, 'html')
app.add_node(todolist)

View File

@@ -35,3 +35,9 @@ Utility components
.. autoclass:: sphinx.events.EventManager
:members:
Utility types
-------------
.. autoclass:: sphinx.util.typing.ExtensionMetadata
:members:

View File

@@ -12,6 +12,7 @@ if TYPE_CHECKING:
from docutils.nodes import Element
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
# deprecated name -> (object to return, canonical path or empty string)
_DEPRECATED_OBJECTS = {
@@ -573,7 +574,7 @@ class manpage(nodes.Inline, nodes.FixedTextElement):
"""Node for references to manpages."""
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_node(toctree)
app.add_node(desc)

View File

@@ -18,6 +18,7 @@ from sphinx.util.osutil import ensuredir, os_path
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -155,7 +156,7 @@ class ChangesBuilder(Builder):
pass
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(ChangesBuilder)
return {

View File

@@ -3,7 +3,7 @@
from __future__ import annotations
from os import path
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from sphinx.builders.html import StandaloneHTMLBuilder
from sphinx.util import logging
@@ -11,6 +11,7 @@ from sphinx.util.osutil import SEP, os_path
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -42,7 +43,7 @@ class DirectoryHTMLBuilder(StandaloneHTMLBuilder):
return outfilename
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.setup_extension('sphinx.builders.html')
app.add_builder(DirectoryHTMLBuilder)

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from sphinx.builders import Builder
from sphinx.locale import __
@@ -11,6 +11,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
class DummyBuilder(Builder):
@@ -38,7 +39,7 @@ class DummyBuilder(Builder):
pass
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(DummyBuilder)
return {

View File

@@ -22,6 +22,7 @@ from sphinx.util.osutil import make_filename
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -257,7 +258,7 @@ def convert_epub_css_files(app: Sphinx, config: Config) -> None:
config.epub_css_files = epub_css_files # type: ignore[attr-defined]
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(Epub3Builder)
# config values

View File

@@ -33,6 +33,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -302,7 +303,7 @@ def _gettext_compact_validator(app: Sphinx, config: Config) -> None:
config.gettext_compact = True # type: ignore[attr-defined]
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(MessageCatalogBuilder)
app.add_config_value('gettext_compact', True, 'gettext', {bool, str})

View File

@@ -58,6 +58,7 @@ if TYPE_CHECKING:
from sphinx.config import _ConfigRebuild
from sphinx.environment import BuildEnvironment
from sphinx.util.tags import Tags
from sphinx.util.typing import ExtensionMetadata
#: the filename for the inventory of objects
INVENTORY_FILENAME = 'objects.inv'
@@ -1296,7 +1297,7 @@ def error_on_html_4(_app: Sphinx, config: Config) -> None:
))
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
# builders
app.add_builder(StandaloneHTMLBuilder)

View File

@@ -12,6 +12,7 @@ from sphinx.util.nodes import NodeMatcher
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
class KeyboardTransform(SphinxPostTransform):
@@ -77,7 +78,7 @@ class KeyboardTransform(SphinxPostTransform):
return False
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_post_transform(KeyboardTransform)
return {

View File

@@ -39,6 +39,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
XINDY_LANG_OPTIONS = {
# language codes from docutils.writers.latex2e.Babel
@@ -521,7 +522,7 @@ def default_latex_documents(config: Config) -> list[tuple[str, str, str, str, st
config.latex_theme)]
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.setup_extension('sphinx.builders.latex.transforms')
app.add_builder(LaTeXBuilder)

View File

@@ -25,6 +25,7 @@ if TYPE_CHECKING:
from docutils.nodes import Element, Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
URI_SCHEMES = ('mailto:', 'http:', 'https:', 'ftp:')
@@ -631,7 +632,7 @@ class IndexInSectionTitleTransform(SphinxPostTransform):
node.parent.insert(i + 1, index)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_transform(FootnoteDocnameUpdater)
app.add_post_transform(SubstitutionDefinitionsRemover)
app.add_post_transform(BibliographyTransform)

View File

@@ -42,6 +42,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -655,7 +656,7 @@ def compile_linkcheck_allowed_redirects(app: Sphinx, config: Config) -> None:
app.config.linkcheck_allowed_redirects.pop(url)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(CheckExternalLinksBuilder)
app.add_post_transform(HyperlinkCollector)

View File

@@ -22,6 +22,7 @@ from sphinx.writers.manpage import ManualPageTranslator, ManualPageWriter
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -114,7 +115,7 @@ def default_man_pages(config: Config) -> list[tuple[str, str, str, list[str], in
[config.author], 1)]
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(ManualPageBuilder)
app.add_config_value('man_pages', default_man_pages, '')

View File

@@ -19,6 +19,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -190,7 +191,7 @@ class SingleFileHTMLBuilder(StandaloneHTMLBuilder):
self.handle_page('opensearch', {}, 'opensearch.xml', outfilename=fn)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.setup_extension('sphinx.builders.html')
app.add_builder(SingleFileHTMLBuilder)

View File

@@ -32,6 +32,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
template_dir = os.path.join(package_dir, 'templates', 'texinfo')
@@ -214,7 +215,7 @@ def default_texinfo_documents(
'One line description of project', 'Miscellaneous')]
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(TexinfoBuilder)
app.add_config_value('texinfo_documents', default_texinfo_documents, '')

View File

@@ -3,7 +3,7 @@
from __future__ import annotations
from os import path
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from docutils.io import StringOutput
@@ -19,6 +19,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -79,7 +80,7 @@ class TextBuilder(Builder):
pass
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(TextBuilder)
app.add_config_value('text_sectionchars', '*=-~"+`', 'env')

View File

@@ -3,7 +3,7 @@
from __future__ import annotations
from os import path
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from docutils import nodes
from docutils.io import StringOutput
@@ -21,6 +21,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -112,7 +113,7 @@ class PseudoXMLBuilder(XMLBuilder):
_writer_class = PseudoXMLWriter
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(XMLBuilder)
app.add_builder(PseudoXMLBuilder)

View File

@@ -15,7 +15,7 @@ from sphinx.errors import ConfigError, ExtensionError
from sphinx.locale import _, __
from sphinx.util import logging
from sphinx.util.osutil import fs_encoding
from sphinx.util.typing import NoneType
from sphinx.util.typing import ExtensionMetadata, NoneType
if sys.version_info >= (3, 11):
from contextlib import chdir
@@ -703,7 +703,7 @@ def check_root_doc(app: Sphinx, env: BuildEnvironment, added: set[str],
return changed
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.connect('config-inited', convert_source_suffix, priority=800)
app.connect('config-inited', convert_highlight_options, priority=800)
app.connect('config-inited', init_numfig_format, priority=800)

View File

@@ -3,7 +3,7 @@
from __future__ import annotations
import re
from typing import TYPE_CHECKING, Any, Generic, TypeVar, cast
from typing import TYPE_CHECKING, Generic, TypeVar, cast
from docutils import nodes
from docutils.parsers.rst import directives, roles
@@ -14,7 +14,7 @@ from sphinx.util import docutils
from sphinx.util.docfields import DocFieldTransformer, Field, TypedField
from sphinx.util.docutils import SphinxDirective
from sphinx.util.nodes import nested_parse_with_titles
from sphinx.util.typing import OptionSpec # NoQA: TCH001
from sphinx.util.typing import ExtensionMetadata, OptionSpec # NoQA: TCH001
if TYPE_CHECKING:
from docutils.nodes import Node
@@ -356,7 +356,7 @@ class DefaultDomain(SphinxDirective):
return []
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_config_value("strip_signature_backslash", False, 'env')
directives.register_directive('default-role', DefaultRole)
directives.register_directive('default-domain', DefaultDomain)

View File

@@ -20,7 +20,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -469,7 +469,7 @@ class LiteralInclude(SphinxDirective):
return [document.reporter.warning(exc, line=self.lineno)]
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
directives.register_directive('highlight', Highlight)
directives.register_directive('code-block', CodeBlock)
directives.register_directive('sourcecode', CodeBlock)

View File

@@ -25,7 +25,7 @@ if TYPE_CHECKING:
from docutils.nodes import Element, Node
from sphinx.application import Sphinx
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
glob_re = re.compile(r'.*[*?\[].*')
@@ -425,7 +425,7 @@ class Include(BaseInclude, SphinxDirective):
return super().run()
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
directives.register_directive('toctree', TocTree)
directives.register_directive('sectionauthor', Author)
directives.register_directive('moduleauthor', Author)

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
import os
from os import path
from typing import TYPE_CHECKING, Any, cast
from typing import TYPE_CHECKING, cast
from docutils import nodes
from docutils.nodes import Node, make_id
@@ -21,7 +21,7 @@ from sphinx.util.osutil import SEP, os_path, relpath
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -176,7 +176,7 @@ class MathDirective(SphinxDirective):
ret.insert(0, target)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
directives.register_directive('figure', Figure)
directives.register_directive('meta', Meta)
directives.register_directive('csv-table', CSVTable)

View File

@@ -42,7 +42,7 @@ if TYPE_CHECKING:
from sphinx.builders import Builder
from sphinx.domains.c._symbol import LookupKey
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -780,7 +780,7 @@ class CDomain(Domain):
yield (name, dispname, objectType, docname, newestId, 1)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(CDomain)
app.add_config_value("c_id_attributes", [], 'env')
app.add_config_value("c_paren_attributes", [], 'env')

View File

@@ -16,7 +16,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
versionlabels = {
@@ -150,7 +150,7 @@ class ChangeSetDomain(Domain):
return self.changesets.get(version, [])
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(ChangeSetDomain)
app.add_directive('deprecated', VersionChange)
app.add_directive('versionadded', VersionChange)

View File

@@ -19,6 +19,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.builders import Builder
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -143,7 +144,7 @@ class CitationReferenceTransform(SphinxTransform):
domain.note_citation_reference(ref)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(CitationDomain)
app.add_transform(CitationDefinitionTransform)
app.add_transform(CitationReferenceTransform)

View File

@@ -46,7 +46,7 @@ if TYPE_CHECKING:
from sphinx.builders import Builder
from sphinx.domains.cpp._symbol import LookupKey
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -1063,7 +1063,7 @@ class CPPDomain(Domain):
return f'{parentName}::{target}'
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(CPPDomain)
app.add_config_value("cpp_index_common_prefix", [], 'env')
app.add_config_value("cpp_id_attributes", [], 'env')

View File

@@ -21,7 +21,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -115,7 +115,7 @@ class IndexRole(ReferenceRole):
return [index, target, text], []
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(IndexDomain)
app.add_directive('index', IndexDirective)
app.add_role('index', IndexRole())

View File

@@ -28,7 +28,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.builders import Builder
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -498,7 +498,7 @@ class JavaScriptDomain(Domain):
return '.'.join(filter(None, [modname, prefix, target]))
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(JavaScriptDomain)
app.add_config_value(
'javascript_maximum_signature_line_length', None, 'env', {int, type(None)},

View File

@@ -20,6 +20,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.builders import Builder
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -144,7 +145,7 @@ class MathDomain(Domain):
)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(MathDomain)
app.add_role('eq', MathReferenceRole(warn_dangling=True))

View File

@@ -34,7 +34,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.builders import Builder
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -870,7 +870,7 @@ def builtin_resolver(app: Sphinx, env: BuildEnvironment,
return None
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.setup_extension('sphinx.directives')
app.add_domain(PythonDomain)

View File

@@ -24,7 +24,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.builders import Builder
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -293,7 +293,7 @@ class ReSTDomain(Domain):
yield name, name, typ, docname, node_id, 1
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(ReSTDomain)
return {

View File

@@ -27,7 +27,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.builders import Builder
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec, RoleFunction
from sphinx.util.typing import ExtensionMetadata, OptionSpec, RoleFunction
logger = logging.getLogger(__name__)
@@ -1114,7 +1114,7 @@ def warn_missing_reference(app: Sphinx, domain: Domain, node: pending_xref,
return True
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_domain(StandardDomain)
app.connect('warn-missing-reference', warn_missing_reference)

View File

@@ -5,7 +5,7 @@ from __future__ import annotations
import os
from glob import glob
from os import path
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from docutils import nodes
from docutils.utils import relative_path
@@ -22,6 +22,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -136,7 +137,7 @@ class DownloadFileCollector(EnvironmentCollector):
node['filename'] = app.env.dlfiles.add_file(app.env.docname, rel_filename)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_env_collector(ImageCollector)
app.add_env_collector(DownloadFileCollector)

View File

@@ -4,7 +4,7 @@ from __future__ import annotations
import os
from os import path
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from docutils.utils import relative_path
@@ -16,6 +16,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
class DependenciesCollector(EnvironmentCollector):
@@ -47,7 +48,7 @@ class DependenciesCollector(EnvironmentCollector):
app.env.dependencies[app.env.docname].add(relpath)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_env_collector(DependenciesCollector)
return {

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any, cast
from typing import TYPE_CHECKING, cast
from docutils import nodes
@@ -11,6 +11,7 @@ from sphinx.environment.collectors import EnvironmentCollector
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
class MetadataCollector(EnvironmentCollector):
@@ -60,7 +61,7 @@ class MetadataCollector(EnvironmentCollector):
doctree.pop(index)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_env_collector(MetadataCollector)
return {

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from docutils import nodes
@@ -12,6 +12,7 @@ from sphinx.transforms import SphinxContentsFilter
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
class TitleCollector(EnvironmentCollector):
@@ -51,7 +52,7 @@ class TitleCollector(EnvironmentCollector):
app.env.longtitles[app.env.docname] = longtitlenode
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_env_collector(TitleCollector)
return {

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any, TypeVar, cast
from typing import TYPE_CHECKING, TypeVar, cast
from docutils import nodes
@@ -20,6 +20,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
N = TypeVar('N')
@@ -345,7 +346,7 @@ def _make_anchor_name(ids: list[str], num_entries: list[int]) -> str:
return anchorname
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_env_collector(TocTreeCollector)
return {

View File

@@ -33,7 +33,13 @@ from sphinx.util.inspect import (
safe_getattr,
stringify_signature,
)
from sphinx.util.typing import OptionSpec, get_type_hints, restify, stringify_annotation
from sphinx.util.typing import (
ExtensionMetadata,
OptionSpec,
get_type_hints,
restify,
stringify_annotation,
)
if TYPE_CHECKING:
from collections.abc import Iterator, Sequence
@@ -2844,7 +2850,7 @@ def autodoc_attrgetter(app: Sphinx, obj: Any, name: str, *defargs: Any) -> Any:
return safe_getattr(obj, name, *defargs)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_autodocumenter(ModuleDocumenter)
app.add_autodocumenter(ClassDocumenter)
app.add_autodocumenter(ExceptionDocumenter)

View File

@@ -22,6 +22,7 @@ if TYPE_CHECKING:
from typing import Any
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
_LAMBDA_NAME = (lambda: None).__name__
@@ -189,7 +190,7 @@ def update_defvalue(app: Sphinx, obj: Any, bound_method: bool) -> None:
logger.warning(__("Failed to parse a default argument value for %r: %s"), obj, exc)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_config_value('autodoc_preserve_defaults', False, 'env')
app.connect('autodoc-before-process-signature', update_defvalue)

View File

@@ -15,6 +15,7 @@ if TYPE_CHECKING:
from collections.abc import Sequence
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -134,7 +135,7 @@ def update_annotations_using_type_comments(app: Sphinx, obj: Any, bound_method:
logger.warning(__("Failed to parse type_comment for %r: %s"), obj, exc)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.connect('autodoc-before-process-signature', update_annotations_using_type_comments)
return {'version': sphinx.__display_version__, 'parallel_read_safe': True}

View File

@@ -11,7 +11,7 @@ from docutils import nodes
import sphinx
from sphinx import addnodes
from sphinx.util import inspect
from sphinx.util.typing import stringify_annotation
from sphinx.util.typing import ExtensionMetadata, stringify_annotation
if TYPE_CHECKING:
from docutils.nodes import Element
@@ -209,7 +209,7 @@ def augment_descriptions_with_types(
node += field
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.connect('autodoc-process-signature', record_typehints)
app.connect('object-description-transform', merge_typehints)

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any, cast
from typing import TYPE_CHECKING, cast
from docutils import nodes
@@ -16,6 +16,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -57,7 +58,7 @@ def register_sections_as_label(app: Sphinx, document: Node) -> None:
domain.labels[name] = docname, labelid, sectname
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_config_value('autosectionlabel_prefix_document', False, 'env')
app.add_config_value('autosectionlabel_maxdepth', None, 'env')
app.connect('doctree-read', register_sections_as_label)

View File

@@ -95,7 +95,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.extension import Extension
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
from sphinx.writers.html import HTML5Translator
logger = logging.getLogger(__name__)
@@ -821,7 +821,7 @@ def process_generate_options(app: Sphinx) -> None:
encoding=app.config.source_encoding)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
# I need autodoc
app.setup_extension('sphinx.ext.autodoc')
app.add_node(autosummary_toc,

View File

@@ -26,6 +26,7 @@ if TYPE_CHECKING:
from collections.abc import Iterator
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -388,7 +389,7 @@ class CoverageBuilder(Builder):
self.py_undocumented, self.py_documented), dumpfile)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_builder(CoverageBuilder)
app.add_config_value('coverage_ignore_modules', [], '')
app.add_config_value('coverage_ignore_functions', [], '')

View File

@@ -32,7 +32,7 @@ if TYPE_CHECKING:
from docutils.nodes import Element, Node, TextElement
from sphinx.application import Sphinx
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
logger = logging.getLogger(__name__)
@@ -563,7 +563,7 @@ Doctest summary
run_setup_cleanup(self.cleanup_runner, group.cleanup, 'cleanup')
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_directive('testsetup', TestsetupDirective)
app.add_directive('testcleanup', TestcleanupDirective)
app.add_directive('doctest', DoctestDirective)

View File

@@ -37,7 +37,7 @@ if TYPE_CHECKING:
from docutils.parsers.rst.states import Inliner
from sphinx.application import Sphinx
from sphinx.util.typing import RoleFunction
from sphinx.util.typing import ExtensionMetadata, RoleFunction
logger = logging.getLogger(__name__)
@@ -117,7 +117,7 @@ def setup_link_roles(app: Sphinx) -> None:
app.add_role(name, make_link_role(name, base_url, caption))
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_config_value('extlinks', {}, 'env')
app.add_config_value('extlinks_detect_hardcoded_links', False, 'env')

View File

@@ -5,13 +5,14 @@ from __future__ import annotations
import contextlib
import os
import urllib.parse
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
import sphinx
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
def _get_domain_from_url(url: str) -> str:
@@ -52,6 +53,6 @@ def create_nojekyll_and_cname(app: Sphinx, env: BuildEnvironment) -> None:
os.unlink(cname_path)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.connect('env-updated', create_nojekyll_and_cname)
return {'version': sphinx.__display_version__, 'parallel_read_safe': True}

View File

@@ -31,7 +31,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
from sphinx.writers.html import HTML5Translator
from sphinx.writers.latex import LaTeXTranslator
from sphinx.writers.manpage import ManualPageTranslator
@@ -452,7 +452,7 @@ def on_config_inited(_app: Sphinx, config: Config) -> None:
config.html_static_path.append(css_path)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_node(graphviz,
html=(html_visit_graphviz, None),
latex=(latex_visit_graphviz, None),

View File

@@ -16,7 +16,7 @@ namespace of the project configuration (that is, all variables from
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from docutils import nodes
@@ -28,7 +28,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
class ifconfig(nodes.Element):
@@ -74,7 +74,7 @@ def process_ifconfig_nodes(app: Sphinx, doctree: nodes.document, docname: str) -
node.replace_self(node.children)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_node(ifconfig)
app.add_directive('ifconfig', IfConfig)
app.connect('doctree-resolved', process_ifconfig_nodes)

View File

@@ -5,7 +5,7 @@ from __future__ import annotations
import subprocess
import sys
from subprocess import CalledProcessError
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
import sphinx
from sphinx.errors import ExtensionError
@@ -15,6 +15,7 @@ from sphinx.util import logging
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -73,7 +74,7 @@ class ImagemagickConverter(ImageConverter):
(exc.stderr, exc.stdout)) from exc
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_post_transform(ImagemagickConverter)
if sys.platform == 'win32':
# On Windows, we use Imagemagik v7 by default to avoid the trouble for

View File

@@ -11,7 +11,7 @@ import tempfile
from hashlib import sha1
from os import path
from subprocess import CalledProcessError
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from docutils import nodes
@@ -33,6 +33,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.builders import Builder
from sphinx.config import Config
from sphinx.util.typing import ExtensionMetadata
from sphinx.writers.html import HTML5Translator
logger = logging.getLogger(__name__)
@@ -384,7 +385,7 @@ def html_visit_displaymath(self: HTML5Translator, node: nodes.math_block) -> Non
raise nodes.SkipNode
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_html_math_renderer('imgmath',
(html_visit_math, None),
(html_visit_displaymath, None))

View File

@@ -58,7 +58,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
from sphinx.writers.html import HTML5Translator
from sphinx.writers.latex import LaTeXTranslator
from sphinx.writers.texinfo import TexinfoTranslator
@@ -477,7 +477,7 @@ def skip(self: nodes.NodeVisitor, node: inheritance_diagram) -> None:
raise nodes.SkipNode
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.setup_extension('sphinx.ext.graphviz')
app.add_node(
inheritance_diagram,

View File

@@ -53,7 +53,7 @@ if TYPE_CHECKING:
from sphinx.config import Config
from sphinx.domains import Domain
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import Inventory, InventoryItem, RoleFunction
from sphinx.util.typing import ExtensionMetadata, Inventory, InventoryItem, RoleFunction
InventoryCacheEntry = tuple[Union[str, None], int, Inventory]
@@ -707,7 +707,7 @@ def normalize_intersphinx_mapping(app: Sphinx, config: Config) -> None:
config.intersphinx_mapping.pop(key)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_config_value('intersphinx_mapping', {}, 'env')
app.add_config_value('intersphinx_cache_limit', 5, '')
app.add_config_value('intersphinx_timeout', None, '')

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
from docutils import nodes
@@ -15,6 +15,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
class LinkcodeError(SphinxError):
@@ -71,7 +72,7 @@ def doctree_read(app: Sphinx, doctree: Node) -> None:
signode += onlynode
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.connect('doctree-read', doctree_read)
app.add_config_value('linkcode_resolve', None, '')
return {'version': sphinx.__display_version__, 'parallel_read_safe': True}

View File

@@ -21,6 +21,7 @@ from sphinx.util.math import get_node_equation_number
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
from sphinx.writers.html import HTML5Translator
# more information for mathjax secure url is here:
@@ -109,7 +110,7 @@ def install_mathjax(app: Sphinx, pagename: str, templatename: str, context: dict
builder.add_js_file(app.config.mathjax_path, **options)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_html_math_renderer('mathjax',
(html_visit_math, None),
(html_visit_displaymath, None))

View File

@@ -11,6 +11,7 @@ from sphinx.util import inspect
if TYPE_CHECKING:
from sphinx.config import _ConfigRebuild
from sphinx.util.typing import ExtensionMetadata
class Config:
@@ -292,7 +293,7 @@ class Config:
setattr(self, name, value)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
"""Sphinx extension setup function.
When the extension is loaded, Sphinx imports this module and executes

View File

@@ -28,7 +28,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import OptionSpec
from sphinx.util.typing import ExtensionMetadata, OptionSpec
from sphinx.writers.html import HTML5Translator
from sphinx.writers.latex import LaTeXTranslator
@@ -224,7 +224,7 @@ def latex_depart_todo_node(self: LaTeXTranslator, node: todo_node) -> None:
self.body.append('\\end{sphinxadmonition}\n')
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_event('todo-defined')
app.add_config_value('todo_include_todos', False, 'html')
app.add_config_value('todo_link_only', False, 'html')

View File

@@ -27,6 +27,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.builders import Builder
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -341,7 +342,7 @@ def collect_pages(app: Sphinx) -> Generator[tuple[str, dict[str, Any], str], Non
yield (posixpath.join(OUTPUT_DIRNAME, 'index'), context, 'page.html')
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_config_value('viewcode_import', None, '')
app.add_config_value('viewcode_enable_epub', False, '')
app.add_config_value('viewcode_follow_imported_members', True, '')

View File

@@ -13,7 +13,7 @@ from sphinx.util import logging
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.util.typing import _ExtensionMetadata
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -22,7 +22,7 @@ class Extension:
def __init__(self, name: str, module: Any, **kwargs: Any) -> None:
self.name = name
self.module = module
self.metadata: _ExtensionMetadata = kwargs # type: ignore[assignment]
self.metadata: ExtensionMetadata = kwargs # type: ignore[assignment]
self.version = kwargs.pop('version', 'unknown version')
# The extension supports parallel read or not. The default value
@@ -82,7 +82,7 @@ def verify_needs_extensions(app: Sphinx, config: Config) -> None:
)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.connect('config-inited', verify_needs_extensions, priority=800)
return {

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING
import docutils.parsers
import docutils.parsers.rst
@@ -19,6 +19,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
class Parser(docutils.parsers.Parser):
@@ -88,7 +89,7 @@ class RSTParser(docutils.parsers.rst.Parser, Parser):
append_epilog(content, self.config.rst_epilog)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_source_parser(RSTParser)
return {

View File

@@ -40,9 +40,9 @@ if TYPE_CHECKING:
from sphinx.environment import BuildEnvironment
from sphinx.ext.autodoc import Documenter
from sphinx.util.typing import (
ExtensionMetadata,
RoleFunction,
TitleGetter,
_ExtensionMetadata,
_ExtensionSetupFunc,
)
@@ -460,7 +460,7 @@ class SphinxComponentRegistry:
if setup is None:
logger.warning(__('extension %r has no setup() function; is it really '
'a Sphinx extension module?'), extname)
metadata: _ExtensionMetadata = {}
metadata: ExtensionMetadata = {}
else:
try:
metadata = setup(app)
@@ -513,7 +513,7 @@ def merge_source_suffix(app: Sphinx, config: Config) -> None:
app.registry.source_suffix = app.config.source_suffix
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.connect('config-inited', merge_source_suffix, priority=800)
return {

View File

@@ -22,7 +22,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import RoleFunction
from sphinx.util.typing import ExtensionMetadata, RoleFunction
generic_docroles = {
@@ -457,7 +457,7 @@ specific_docroles: dict[str, RoleFunction] = {
}
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
from docutils.parsers.rst import roles
for rolename, nodeclass in generic_docroles.items():

View File

@@ -29,6 +29,7 @@ if TYPE_CHECKING:
from sphinx.config import Config
from sphinx.domains.std import StandardDomain
from sphinx.environment import BuildEnvironment
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -488,7 +489,7 @@ def _sort_key(node: nodes.Node) -> int:
raise ValueError(msg)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_transform(ApplySourceWorkaround)
app.add_transform(ExtraTranslatableNodes)
app.add_transform(DefaultSubstitutions)

View File

@@ -13,6 +13,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
class RefOnlyListChecker(nodes.GenericNodeVisitor):
@@ -80,7 +81,7 @@ class RefOnlyBulletListTransform(SphinxTransform):
item.replace(para, compact_para)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_transform(RefOnlyBulletListTransform)
return {

View File

@@ -33,6 +33,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.config import Config
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -611,7 +612,7 @@ class RemoveTranslatableInline(SphinxTransform):
inline.parent += inline.children
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_transform(PreserveTranslatableMessages)
app.add_transform(Locale)
app.add_transform(TranslationProgressTotaliser)

View File

@@ -23,6 +23,7 @@ if TYPE_CHECKING:
from sphinx.addnodes import pending_xref
from sphinx.application import Sphinx
from sphinx.domains import Domain
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -288,7 +289,7 @@ class PropagateDescDomain(SphinxPostTransform):
node['classes'].append(node.parent['domain'])
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_post_transform(ReferencesResolver)
app.add_post_transform(OnlyNodeTransform)
app.add_post_transform(SigElementFallbackTransform)

View File

@@ -16,6 +16,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node, TextElement
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
class HighlightSetting(NamedTuple):
@@ -130,7 +131,7 @@ class TrimDoctestFlagsTransform(SphinxTransform):
return False
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_post_transform(HighlightLanguageTransform)
app.add_post_transform(TrimDoctestFlagsTransform)

View File

@@ -19,6 +19,7 @@ from sphinx.util.osutil import ensuredir
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
logger = logging.getLogger(__name__)
@@ -275,7 +276,7 @@ class ImageConverter(BaseImageConverter):
raise NotImplementedError
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_post_transform(ImageDownloader)
app.add_post_transform(DataURIExtractor)

View File

@@ -10,6 +10,7 @@ from sphinx.transforms import SphinxTransform
if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
class SphinxDanglingReferences(DanglingReferences):
@@ -37,7 +38,7 @@ class SphinxDomains(SphinxTransform):
domain.process_doc(self.env, self.env.docname, self.document)
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_transform(SphinxDanglingReferences)
app.add_transform(SphinxDomains)

View File

@@ -90,17 +90,28 @@ InventoryItem = tuple[
Inventory = dict[str, dict[str, InventoryItem]]
# return of a setup() function
# https://www.sphinx-doc.org/en/master/extdev/index.html#extension-metadata
class _ExtensionMetadata(TypedDict, total=False):
class ExtensionMetadata(TypedDict, total=False):
"""The metadata returned by an extension's ``setup()`` function.
See :ref:`ext-metadata`.
"""
version: str
"""The extension version (default: ``'unknown version'``)."""
env_version: int
"""An integer that identifies the version of env data added by the extension."""
parallel_read_safe: bool
"""Indicate whether parallel reading of source files is supported
by the extension.
"""
parallel_write_safe: bool
"""Indicate whether parallel writing of output files is supported
by the extension (default: ``True``).
"""
if TYPE_CHECKING:
_ExtensionSetupFunc = Callable[[Sphinx], _ExtensionMetadata]
_ExtensionSetupFunc = Callable[[Sphinx], ExtensionMetadata]
def get_type_hints(

View File

@@ -17,6 +17,7 @@ if TYPE_CHECKING:
from docutils.nodes import Node
from sphinx.application import Sphinx
from sphinx.util.typing import ExtensionMetadata
try:
import Levenshtein # type: ignore[import-not-found]
@@ -171,7 +172,7 @@ class UIDTransform(SphinxTransform):
list(merge_doctrees(old_doctree, self.document, env.versioning_condition))
def setup(app: Sphinx) -> dict[str, Any]:
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_transform(UIDTransform)
return {