diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py index 9ec4898c1..5645ac91b 100644 --- a/sphinx/addnodes.py +++ b/sphinx/addnodes.py @@ -104,7 +104,7 @@ class toctree(nodes.General, nodes.Element, translatable): self['caption'] = translated_message def extract_original_messages(self) -> List[str]: - messages = [] # type: List[str] + messages: List[str] = [] # toctree entries messages.extend(self.get('rawentries', [])) @@ -209,7 +209,7 @@ class desc_content(nodes.General, nodes.Element): class desc_sig_element(nodes.inline): """Common parent class of nodes for inline text of a signature.""" - classes = [] # type: List[str] + classes: List[str] = [] def __init__(self, rawsource: str = '', text: str = '', *children: Element, **attributes: Any) -> None: diff --git a/sphinx/application.py b/sphinx/application.py index 9878a3e71..ef77e34db 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -140,12 +140,12 @@ class Sphinx: verbosity: int = 0, parallel: int = 0, keep_going: bool = False) -> None: self.phase = BuildPhase.INITIALIZATION self.verbosity = verbosity - self.extensions = {} # type: Dict[str, Extension] - self.builder = None # type: Builder - self.env = None # type: BuildEnvironment - self.project = None # type: Project + self.extensions: Dict[str, Extension] = {} + self.builder: Builder = None + self.env: BuildEnvironment = None + self.project: Project = None self.registry = SphinxComponentRegistry() - self.html_themes = {} # type: Dict[str, str] + self.html_themes: Dict[str, str] = {} # validate provided directories self.srcdir = abspath(srcdir) @@ -173,14 +173,14 @@ class Sphinx: self.parallel = parallel if status is None: - self._status = StringIO() # type: IO + self._status: IO = StringIO() self.quiet = True else: self._status = status self.quiet = False if warning is None: - self._warning = StringIO() # type: IO + self._warning: IO = StringIO() else: self._warning = warning self._warncount = 0 @@ -195,7 +195,7 @@ class Sphinx: # keep last few messages for traceback # This will be filled by sphinx.util.logging.LastMessagesWriter - self.messagelog = deque(maxlen=10) # type: deque + self.messagelog: deque = deque(maxlen=10) # say hello to the world logger.info(bold(__('Running Sphinx v%s') % sphinx.__display_version__)) @@ -292,7 +292,7 @@ class Sphinx: if catalog.domain == 'sphinx' and catalog.is_outdated(): catalog.write_mo(self.config.language) - locale_dirs = list(repo.locale_dirs) # type: List[Optional[str]] + locale_dirs: List[Optional[str]] = list(repo.locale_dirs) locale_dirs += [None] locale_dirs += [path.join(package_dir, 'locale')] diff --git a/sphinx/builders/texinfo.py b/sphinx/builders/texinfo.py index 8bd211f22..ee10d58c3 100644 --- a/sphinx/builders/texinfo.py +++ b/sphinx/builders/texinfo.py @@ -53,8 +53,8 @@ class TexinfoBuilder(Builder): default_translator_class = TexinfoTranslator def init(self) -> None: - self.docnames = [] # type: Iterable[str] - self.document_data = [] # type: List[Tuple[str, str, str, str, str, str, str, bool]] + self.docnames: Iterable[str] = [] + self.document_data: List[Tuple[str, str, str, str, str, str, str, bool]] = [] def get_outdated_docs(self) -> Union[str, List[str]]: return 'all documents' # for now @@ -76,7 +76,7 @@ class TexinfoBuilder(Builder): 'will be written')) return # assign subdirs to titles - self.titles = [] # type: List[Tuple[str, str]] + self.titles: List[Tuple[str, str]] = [] for entry in preliminary_document_data: docname = entry[0] if docname not in self.env.all_docs: @@ -109,10 +109,10 @@ class TexinfoBuilder(Builder): with progress_message(__("writing")): self.post_process_images(doctree) docwriter = TexinfoWriter(self) - settings = OptionParser( + settings: Any = OptionParser( defaults=self.env.settings, components=(docwriter,), - read_config_files=True).get_default_values() # type: Any + read_config_files=True).get_default_values() settings.author = author settings.title = title settings.texinfo_filename = targetname[:-5] + '.info' diff --git a/sphinx/config.py b/sphinx/config.py index d7f9c4f8a..a9fdddc8a 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -14,7 +14,7 @@ import types from collections import OrderedDict from os import getenv, path from typing import (TYPE_CHECKING, Any, Callable, Dict, Generator, Iterator, List, NamedTuple, - Set, Tuple, Union) + Optional, Set, Tuple, Union) from sphinx.errors import ConfigError, ExtensionError from sphinx.locale import _, __ @@ -88,7 +88,7 @@ class Config: # If you add a value here, don't forget to include it in the # quickstart.py file template as well as in the docs! - config_values = { + config_values: Dict[str, Tuple] = { # general options 'project': ('Python', 'env', []), 'author': ('unknown', 'env', []), @@ -146,20 +146,20 @@ class Config: 'smartquotes_excludes': ({'languages': ['ja'], 'builders': ['man', 'text']}, 'env', []), - } # type: Dict[str, Tuple] + } def __init__(self, config: Dict[str, Any] = {}, overrides: Dict[str, Any] = {}) -> None: self.overrides = dict(overrides) self.values = Config.config_values.copy() self._raw_config = config - self.setup = config.get('setup', None) # type: Callable + self.setup: Optional[Callable] = config.get('setup', None) if 'extensions' in self.overrides: if isinstance(self.overrides['extensions'], str): config['extensions'] = self.overrides.pop('extensions').split(',') else: config['extensions'] = self.overrides.pop('extensions') - self.extensions = config.get('extensions', []) # type: List[str] + self.extensions: List[str] = config.get('extensions', []) @classmethod def read(cls, confdir: str, overrides: Dict = None, tags: Tags = None) -> "Config": @@ -311,7 +311,7 @@ class Config: def eval_config_file(filename: str, tags: Tags) -> Dict[str, Any]: """Evaluate a config file.""" - namespace = {} # type: Dict[str, Any] + namespace: Dict[str, Any] = {} namespace['__file__'] = filename namespace['tags'] = tags diff --git a/sphinx/events.py b/sphinx/events.py index 881882b41..634fdc6ca 100644 --- a/sphinx/events.py +++ b/sphinx/events.py @@ -58,7 +58,7 @@ class EventManager: def __init__(self, app: "Sphinx") -> None: self.app = app self.events = core_events.copy() - self.listeners = defaultdict(list) # type: Dict[str, List[EventListener]] + self.listeners: Dict[str, List[EventListener]] = defaultdict(list) self.next_listener_id = 0 def add(self, name: str) -> None: diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py index 087aaa384..c29714ad4 100644 --- a/sphinx/ext/autosummary/__init__.py +++ b/sphinx/ext/autosummary/__init__.py @@ -60,7 +60,7 @@ import sys import warnings from os import path from types import ModuleType -from typing import Any, Dict, List, Tuple, Type, cast +from typing import Any, Dict, List, Optional, Tuple, Type, cast from docutils import nodes from docutils.nodes import Element, Node, system_message @@ -165,7 +165,7 @@ def autosummary_table_visit_html(self: HTMLTranslator, node: autosummary_table) # -- autodoc integration ------------------------------------------------------- # current application object (used in `get_documenter()`). -_app = None # type: Sphinx +_app: Sphinx = None class FakeDirective(DocumenterBridge): @@ -311,7 +311,7 @@ class Autosummary(SphinxDirective): """ prefixes = get_import_prefixes_from_env(self.env) - items = [] # type: List[Tuple[str, str, str, str]] + items: List[Tuple[str, str, str, str]] = [] max_item_chars = 50 @@ -461,8 +461,8 @@ def mangle_signature(sig: str, max_chars: int = 30) -> str: s = re.sub(r'{[^}]*}', '', s) # Parse the signature to arguments + options - args = [] # type: List[str] - opts = [] # type: List[str] + args: List[str] = [] + opts: List[str] = [] opt_re = re.compile(r"^(.*, |)([a-zA-Z0-9_*]+)\s*=\s*") while s: @@ -579,7 +579,7 @@ def get_import_prefixes_from_env(env: BuildEnvironment) -> List[str]: Obtain current Python import prefixes (for `import_by_name`) from ``document.env`` """ - prefixes = [None] # type: List[str] + prefixes: List[Optional[str]] = [None] currmodule = env.ref_context.get('py:module') if currmodule: @@ -707,7 +707,7 @@ def get_rst_suffix(app: Sphinx) -> str: return ('restructuredtext',) return parser_class.supported - suffix = None # type: str + suffix: str = None for suffix in app.config.source_suffix: if 'restructuredtext' in get_supported_format(suffix): return suffix diff --git a/sphinx/ext/autosummary/generate.py b/sphinx/ext/autosummary/generate.py index 2b17ccbb9..b25d14d72 100644 --- a/sphinx/ext/autosummary/generate.py +++ b/sphinx/ext/autosummary/generate.py @@ -87,11 +87,11 @@ def setup_documenters(app: Any) -> None: FunctionDocumenter, MethodDocumenter, ModuleDocumenter, NewTypeAttributeDocumenter, NewTypeDataDocumenter, PropertyDocumenter) - documenters = [ + documenters: List[Type[Documenter]] = [ ModuleDocumenter, ClassDocumenter, ExceptionDocumenter, DataDocumenter, FunctionDocumenter, MethodDocumenter, NewTypeAttributeDocumenter, NewTypeDataDocumenter, AttributeDocumenter, DecoratorDocumenter, PropertyDocumenter, - ] # type: List[Type[Documenter]] + ] for documenter in documenters: app.registry.add_documenter(documenter.objtype, documenter) @@ -241,8 +241,8 @@ def generate_autosummary_content(name: str, obj: Any, parent: Any, def get_members(obj: Any, types: Set[str], include_public: List[str] = [], imported: bool = True) -> Tuple[List[str], List[str]]: - items = [] # type: List[str] - public = [] # type: List[str] + items: List[str] = [] + public: List[str] = [] for name in dir(obj): try: value = safe_getattr(obj, name) @@ -282,7 +282,7 @@ def generate_autosummary_content(name: str, obj: Any, parent: Any, return public, attrs def get_modules(obj: Any) -> Tuple[List[str], List[str]]: - items = [] # type: List[str] + items: List[str] = [] for _, modname, ispkg in pkgutil.iter_modules(obj.__path__): fullname = name + '.' + modname try: @@ -296,7 +296,7 @@ def generate_autosummary_content(name: str, obj: Any, parent: Any, public = [x for x in items if not x.split('.')[-1].startswith('_')] return public, items - ns = {} # type: Dict[str, Any] + ns: Dict[str, Any] = {} ns.update(context) if doc.objtype == 'module': @@ -447,7 +447,7 @@ def find_autosummary_in_files(filenames: List[str]) -> List[AutosummaryEntry]: See `find_autosummary_in_lines`. """ - documented = [] # type: List[AutosummaryEntry] + documented: List[AutosummaryEntry] = [] for filename in filenames: with open(filename, encoding='utf-8', errors='ignore') as f: lines = f.read().splitlines() @@ -501,10 +501,10 @@ def find_autosummary_in_lines(lines: List[str], module: str = None, filename: st toctree_arg_re = re.compile(r'^\s+:toctree:\s*(.*?)\s*$') template_arg_re = re.compile(r'^\s+:template:\s*(.*?)\s*$') - documented = [] # type: List[AutosummaryEntry] + documented: List[AutosummaryEntry] = [] recursive = False - toctree = None # type: str + toctree: str = None template = None current_module = module in_autosummary = False diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py index e7ee8c67d..242356b61 100644 --- a/sphinx/ext/doctest.py +++ b/sphinx/ext/doctest.py @@ -87,7 +87,7 @@ class TestDirective(SphinxDirective): if not test: test = code code = doctestopt_re.sub('', code) - nodetype = nodes.literal_block # type: Type[TextElement] + nodetype: Type[TextElement] = nodes.literal_block if self.name in ('testsetup', 'testcleanup') or 'hide' in self.options: nodetype = nodes.comment if self.arguments: @@ -202,9 +202,9 @@ parser = doctest.DocTestParser() class TestGroup: def __init__(self, name: str) -> None: self.name = name - self.setup = [] # type: List[TestCode] - self.tests = [] # type: List[List[TestCode]] - self.cleanup = [] # type: List[TestCode] + self.setup: List[TestCode] = [] + self.tests: List[List[TestCode]] = [] + self.cleanup: List[TestCode] = [] def add_code(self, code: "TestCode", prepend: bool = False) -> None: if code.type == 'testsetup': @@ -392,7 +392,7 @@ Doctest summary return False else: condition = node['skipif'] - context = {} # type: Dict[str, Any] + context: Dict[str, Any] = {} if self.config.doctest_global_setup: exec(self.config.doctest_global_setup, context) should_skip = eval(condition, context) @@ -401,7 +401,7 @@ Doctest summary return should_skip def test_doc(self, docname: str, doctree: Node) -> None: - groups = {} # type: Dict[str, TestGroup] + groups: Dict[str, TestGroup] = {} add_to_all_groups = [] self.setup_runner = SphinxDocTestRunner(verbose=False, optionflags=self.opt) @@ -482,7 +482,7 @@ Doctest summary return compile(code, name, self.type, flags, dont_inherit) def test_group(self, group: TestGroup) -> None: - ns = {} # type: Dict + ns: Dict = {} def run_setup_cleanup(runner: Any, testcodes: List[TestCode], what: Any) -> bool: examples = [] diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index e7a2cb51a..6b7c1b73b 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -130,14 +130,14 @@ class TodoListProcessor: self.process(doctree, docname) def process(self, doctree: nodes.document, docname: str) -> None: - todos = sum(self.domain.todos.values(), []) # type: List[todo_node] + todos: List[todo_node] = sum(self.domain.todos.values(), []) for node in doctree.traverse(todolist): if not self.config.todo_include_todos: node.parent.remove(node) continue if node.get('ids'): - content = [nodes.target()] # type: List[Element] + content: List[Element] = [nodes.target()] else: content = [] diff --git a/sphinx/ext/viewcode.py b/sphinx/ext/viewcode.py index c98ff0c88..f2a42f33f 100644 --- a/sphinx/ext/viewcode.py +++ b/sphinx/ext/viewcode.py @@ -111,7 +111,7 @@ def doctree_read(app: Sphinx, doctree: Node) -> None: for objnode in doctree.traverse(addnodes.desc): if objnode.get('domain') != 'py': continue - names = set() # type: Set[str] + names: Set[str] = set() for signode in objnode: if not isinstance(signode, addnodes.desc_signature): continue diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py index ad010474e..329561df0 100644 --- a/sphinx/highlighting.py +++ b/sphinx/highlighting.py @@ -31,8 +31,8 @@ from sphinx.util import logging, texescape logger = logging.getLogger(__name__) -lexers = {} # type: Dict[str, Lexer] -lexer_classes = { +lexers: Dict[str, Lexer] = {} +lexer_classes: Dict[str, Lexer] = { 'none': partial(TextLexer, stripnl=False), 'python': partial(PythonLexer, stripnl=False), 'python3': partial(Python3Lexer, stripnl=False), @@ -40,7 +40,7 @@ lexer_classes = { 'pycon3': partial(PythonConsoleLexer, python3=True, stripnl=False), 'rest': partial(RstLexer, stripnl=False), 'c': partial(CLexer, stripnl=False), -} # type: Dict[str, Lexer] +} escape_hl_chars = {ord('\\'): '\\PYGZbs{}', @@ -80,7 +80,7 @@ class PygmentsBridge: self.latex_engine = latex_engine style = self.get_style(stylename) - self.formatter_args = {'style': style} # type: Dict[str, Any] + self.formatter_args: Dict[str, Any] = {'style': style} if dest == 'html': self.formatter = self.html_formatter else: diff --git a/sphinx/io.py b/sphinx/io.py index 4aa1ecbe9..382d31c89 100644 --- a/sphinx/io.py +++ b/sphinx/io.py @@ -46,7 +46,7 @@ class SphinxBaseReader(standalone.Reader): This replaces reporter by Sphinx's on generating document. """ - transforms = [] # type: List[Type[Transform]] + transforms: List[Type[Transform]] = [] def __init__(self, *args: Any, **kwargs: Any) -> None: from sphinx.application import Sphinx diff --git a/sphinx/locale/__init__.py b/sphinx/locale/__init__.py index 28dda2e1a..1ce65e1e3 100644 --- a/sphinx/locale/__init__.py +++ b/sphinx/locale/__init__.py @@ -103,7 +103,7 @@ class _TranslationProxy(UserString): return '<%s broken>' % self.__class__.__name__ -translators = defaultdict(NullTranslations) # type: Dict[Tuple[str, str], NullTranslations] +translators: Dict[Tuple[str, str], NullTranslations] = defaultdict(NullTranslations) def init(locale_dirs: List[Optional[str]], language: Optional[str], @@ -123,7 +123,7 @@ def init(locale_dirs: List[Optional[str]], language: Optional[str], if language and '_' in language: # for language having country code (like "de_AT") - languages = [language, language.split('_')[0]] # type: Optional[List[str]] + languages: Optional[List[str]] = [language, language.split('_')[0]] elif language: languages = [language] else: @@ -262,7 +262,7 @@ admonitionlabels = { } # Moved to sphinx.directives.other (will be overriden later) -versionlabels = {} # type: Dict[str, str] +versionlabels: Dict[str, str] = {} # Moved to sphinx.domains.python (will be overriden later) -pairindextypes = {} # type: Dict[str, str] +pairindextypes: Dict[str, str] = {} diff --git a/sphinx/project.py b/sphinx/project.py index 258b8d4d6..bb2314c63 100644 --- a/sphinx/project.py +++ b/sphinx/project.py @@ -10,17 +10,13 @@ import os from glob import glob -from typing import TYPE_CHECKING +from typing import Dict, List, Set from sphinx.locale import __ from sphinx.util import get_matching_files, logging, path_stabilize from sphinx.util.matching import compile_matchers from sphinx.util.osutil import SEP, relpath -if TYPE_CHECKING: - from typing import Dict, List, Set - - logger = logging.getLogger(__name__) EXCLUDE_PATHS = ['**/_sources', '.#*', '**/.#*', '*.lproj/**'] @@ -28,8 +24,7 @@ EXCLUDE_PATHS = ['**/_sources', '.#*', '**/.#*', '*.lproj/**'] class Project: """A project is source code set of Sphinx document.""" - def __init__(self, srcdir, source_suffix): - # type: (str, Dict[str, str]) -> None + def __init__(self, srcdir: str, source_suffix: Dict[str, str]) -> None: #: Source directory. self.srcdir = srcdir @@ -37,15 +32,13 @@ class Project: self.source_suffix = source_suffix #: The name of documents belongs to this project. - self.docnames = set() # type: Set[str] + self.docnames: Set[str] = set() - def restore(self, other): - # type: (Project) -> None + def restore(self, other: "Project") -> None: """Take over a result of last build.""" self.docnames = other.docnames - def discover(self, exclude_paths=[]): - # type: (List[str]) -> Set[str] + def discover(self, exclude_paths: List[str] = []) -> Set[str]: """Find all document files in the source directory and put them in :attr:`docnames`. """ @@ -67,8 +60,7 @@ class Project: return self.docnames - def path2doc(self, filename): - # type: (str) -> str + def path2doc(self, filename: str) -> str: """Return the docname for the filename if the file is document. *filename* should be absolute or relative to the source directory. @@ -83,8 +75,7 @@ class Project: # the file does not have docname return None - def doc2path(self, docname, basedir=True): - # type: (str, bool) -> str + def doc2path(self, docname: str, basedir: bool = True) -> str: """Return the filename for the document name. If *basedir* is True, return as an absolute path. diff --git a/sphinx/registry.py b/sphinx/registry.py index 67e2564ff..028188402 100644 --- a/sphinx/registry.py +++ b/sphinx/registry.py @@ -53,74 +53,74 @@ EXTENSION_BLACKLIST = { class SphinxComponentRegistry: def __init__(self) -> None: #: special attrgetter for autodoc; class object -> attrgetter - self.autodoc_attrgettrs = {} # type: Dict[Type, Callable[[Any, str, Any], Any]] + self.autodoc_attrgettrs: Dict[Type, Callable[[Any, str, Any], Any]] = {} #: builders; a dict of builder name -> bulider class - self.builders = {} # type: Dict[str, Type[Builder]] + self.builders: Dict[str, Type[Builder]] = {} #: autodoc documenters; a dict of documenter name -> documenter class - self.documenters = {} # type: Dict[str, Type[Documenter]] + self.documenters: Dict[str, Type[Documenter]] = {} #: css_files; a list of tuple of filename and attributes - self.css_files = [] # type: List[Tuple[str, Dict[str, Any]]] + self.css_files: List[Tuple[str, Dict[str, Any]]] = [] #: domains; a dict of domain name -> domain class - self.domains = {} # type: Dict[str, Type[Domain]] + self.domains: Dict[str, Type[Domain]] = {} #: additional directives for domains #: a dict of domain name -> dict of directive name -> directive - self.domain_directives = {} # type: Dict[str, Dict[str, Any]] + self.domain_directives: Dict[str, Dict[str, Any]] = {} #: additional indices for domains #: a dict of domain name -> list of index class - self.domain_indices = {} # type: Dict[str, List[Type[Index]]] + self.domain_indices: Dict[str, List[Type[Index]]] = {} #: additional object types for domains #: a dict of domain name -> dict of objtype name -> objtype - self.domain_object_types = {} # type: Dict[str, Dict[str, ObjType]] + self.domain_object_types: Dict[str, Dict[str, ObjType]] = {} #: additional roles for domains #: a dict of domain name -> dict of role name -> role impl. - self.domain_roles = {} # type: Dict[str, Dict[str, Union[RoleFunction, XRefRole]]] # NOQA + self.domain_roles: Dict[str, Dict[str, Union[RoleFunction, XRefRole]]] = {} #: additional enumerable nodes #: a dict of node class -> tuple of figtype and title_getter function - self.enumerable_nodes = {} # type: Dict[Type[Node], Tuple[str, TitleGetter]] + self.enumerable_nodes: Dict[Type[Node], Tuple[str, TitleGetter]] = {} #: HTML inline and block math renderers #: a dict of name -> tuple of visit function and depart function - self.html_inline_math_renderers = {} # type: Dict[str, Tuple[Callable, Callable]] - self.html_block_math_renderers = {} # type: Dict[str, Tuple[Callable, Callable]] + self.html_inline_math_renderers: Dict[str, Tuple[Callable, Callable]] = {} + self.html_block_math_renderers: Dict[str, Tuple[Callable, Callable]] = {} #: js_files; list of JS paths or URLs - self.js_files = [] # type: List[Tuple[str, Dict[str, Any]]] + self.js_files: List[Tuple[str, Dict[str, Any]]] = [] #: LaTeX packages; list of package names and its options - self.latex_packages = [] # type: List[Tuple[str, str]] + self.latex_packages: List[Tuple[str, str]] = [] - self.latex_packages_after_hyperref = [] # type: List[Tuple[str, str]] + self.latex_packages_after_hyperref: List[Tuple[str, str]] = [] #: post transforms; list of transforms - self.post_transforms = [] # type: List[Type[Transform]] + self.post_transforms: List[Type[Transform]] = [] #: source paresrs; file type -> parser class - self.source_parsers = {} # type: Dict[str, Type[Parser]] + self.source_parsers: Dict[str, Type[Parser]] = {} #: source inputs; file type -> input class - self.source_inputs = {} # type: Dict[str, Type[Input]] + self.source_inputs: Dict[str, Type[Input]] = {} #: source suffix: suffix -> file type - self.source_suffix = {} # type: Dict[str, str] + self.source_suffix: Dict[str, str] = {} #: custom translators; builder name -> translator class - self.translators = {} # type: Dict[str, Type[nodes.NodeVisitor]] + self.translators: Dict[str, Type[nodes.NodeVisitor]] = {} #: custom handlers for translators #: a dict of builder name -> dict of node name -> visitor and departure functions - self.translation_handlers = {} # type: Dict[str, Dict[str, Tuple[Callable, Callable]]] + self.translation_handlers: Dict[str, Dict[str, Tuple[Callable, Callable]]] = {} #: additional transforms; list of transforms - self.transforms = [] # type: List[Type[Transform]] + self.transforms: List[Type[Transform]] = [] def add_builder(self, builder: Type[Builder], override: bool = False) -> None: logger.debug('[app] adding builder: %r', builder) @@ -426,7 +426,7 @@ class SphinxComponentRegistry: if setup is None: logger.warning(__('extension %r has no setup() function; is it really ' 'a Sphinx extension module?'), extname) - metadata = {} # type: Dict[str, Any] + metadata: Dict[str, Any] = {} else: try: metadata = setup(app) diff --git a/sphinx/roles.py b/sphinx/roles.py index e9452a78c..e194db5bc 100644 --- a/sphinx/roles.py +++ b/sphinx/roles.py @@ -65,8 +65,8 @@ class XRefRole(ReferenceRole): * Subclassing and overwriting `process_link()` and/or `result_nodes()`. """ - nodeclass = addnodes.pending_xref # type: Type[Element] - innernodeclass = nodes.literal # type: Type[TextElement] + nodeclass: Type[Element] = addnodes.pending_xref + innernodeclass: Type[TextElement] = nodes.literal def __init__(self, fix_parens: bool = False, lowercase: bool = False, nodeclass: Type[Element] = None, innernodeclass: Type[TextElement] = None, @@ -284,7 +284,7 @@ class EmphasizedLiteral(SphinxRole): return [node], [] def parse(self, text: str) -> List[Node]: - result = [] # type: List[Node] + result: List[Node] = [] stack = [''] for part in self.parens_re.split(text): @@ -341,7 +341,7 @@ class Abbreviation(SphinxRole): return [nodes.abbreviation(self.rawtext, text, **options)], [] -specific_docroles = { +specific_docroles: Dict[str, RoleFunction] = { # links to download references 'download': XRefRole(nodeclass=addnodes.download_reference), # links to anything @@ -354,7 +354,7 @@ specific_docroles = { 'file': EmphasizedLiteral(), 'samp': EmphasizedLiteral(), 'abbr': Abbreviation(), -} # type: Dict[str, RoleFunction] +} def setup(app: "Sphinx") -> Dict[str, Any]: diff --git a/sphinx/setup_command.py b/sphinx/setup_command.py index a508c50a1..62c83a911 100644 --- a/sphinx/setup_command.py +++ b/sphinx/setup_command.py @@ -16,7 +16,7 @@ import sys from distutils.cmd import Command from distutils.errors import DistutilsExecError from io import StringIO -from typing import TYPE_CHECKING +from typing import Any, Dict from sphinx.application import Sphinx from sphinx.cmd.build import handle_exception @@ -24,9 +24,6 @@ from sphinx.util.console import color_terminal, nocolor from sphinx.util.docutils import docutils_namespace, patch_docutils from sphinx.util.osutil import abspath -if TYPE_CHECKING: - from typing import Any, Dict - class BuildDoc(Command): """ @@ -91,18 +88,18 @@ class BuildDoc(Command): boolean_options = ['fresh-env', 'all-files', 'warning-is-error', 'link-index', 'nitpicky'] - def initialize_options(self): - # type: () -> None + def initialize_options(self) -> None: self.fresh_env = self.all_files = False self.pdb = False - self.source_dir = self.build_dir = None # type: str + self.source_dir: str = None + self.build_dir: str = None self.builder = 'html' self.warning_is_error = False self.project = '' self.version = '' self.release = '' self.today = '' - self.config_dir = None # type: str + self.config_dir: str = None self.link_index = False self.copyright = '' # Link verbosity to distutils' (which uses 1 by default). @@ -111,8 +108,7 @@ class BuildDoc(Command): self.nitpicky = False self.keep_going = False - def _guess_source_dir(self): - # type: () -> str + def _guess_source_dir(self) -> str: for guess in ('doc', 'docs'): if not os.path.isdir(guess): continue @@ -121,8 +117,7 @@ class BuildDoc(Command): return root return os.curdir - def finalize_options(self): - # type: () -> None + def finalize_options(self) -> None: self.ensure_string_list('builder') if self.source_dir is None: @@ -144,15 +139,14 @@ class BuildDoc(Command): (builder, os.path.join(self.build_dir, builder)) for builder in self.builder] - def run(self): - # type: () -> None + def run(self) -> None: if not color_terminal(): nocolor() if not self.verbose: # type: ignore status_stream = StringIO() else: status_stream = sys.stdout # type: ignore - confoverrides = {} # type: Dict[str, Any] + confoverrides: Dict[str, Any] = {} if self.project: confoverrides['project'] = self.project if self.version: diff --git a/sphinx/testing/fixtures.py b/sphinx/testing/fixtures.py index c284208ce..729d9a2d7 100644 --- a/sphinx/testing/fixtures.py +++ b/sphinx/testing/fixtures.py @@ -41,7 +41,7 @@ def rootdir() -> str: class SharedResult: - cache = {} # type: Dict[str, Dict[str, str]] + cache: Dict[str, Dict[str, str]] = {} def store(self, key: str, app_: SphinxTestApp) -> Any: if key in self.cache: @@ -77,7 +77,7 @@ def app_params(request: Any, test_params: Dict, shared_result: SharedResult, else: markers = request.node.get_marker("sphinx") pargs = {} - kwargs = {} # type: Dict[str, Any] + kwargs: Dict[str, Any] = {} if markers is not None: # to avoid stacking positional args @@ -190,7 +190,7 @@ def make_app(test_params: Dict, monkeypatch: Any) -> Generator[Callable, None, N status, warning = StringIO(), StringIO() kwargs.setdefault('status', status) kwargs.setdefault('warning', warning) - app_ = SphinxTestApp(*args, **kwargs) # type: Any + app_: Any = SphinxTestApp(*args, **kwargs) apps.append(app_) if test_params['shared_result']: app_ = SphinxTestAppWrapperForSkipBuilding(app_) diff --git a/sphinx/testing/util.py b/sphinx/testing/util.py index 7868f4d62..bfbb1071c 100644 --- a/sphinx/testing/util.py +++ b/sphinx/testing/util.py @@ -99,8 +99,8 @@ class SphinxTestApp(application.Sphinx): A subclass of :class:`Sphinx` that runs on the test root, with some better default values for the initialization parameters. """ - _status = None # type: StringIO - _warning = None # type: StringIO + _status: StringIO = None + _warning: StringIO = None def __init__(self, buildername: str = 'html', srcdir: path = None, freshenv: bool = False, confoverrides: Dict = None, status: IO = None, warning: IO = None, diff --git a/sphinx/theming.py b/sphinx/theming.py index bba47b344..b7fb652ac 100644 --- a/sphinx/theming.py +++ b/sphinx/theming.py @@ -211,7 +211,7 @@ class HTMLThemeFactory: def find_themes(self, theme_path: str) -> Dict[str, str]: """Search themes from specified directory.""" - themes = {} # type: Dict[str, str] + themes: Dict[str, str] = {} if not path.isdir(theme_path): return themes