diff --git a/CHANGES b/CHANGES index 75383c554..fe5ea741c 100644 --- a/CHANGES +++ b/CHANGES @@ -68,6 +68,10 @@ Bugs fixed * utils package is no longer installed * #3952: apidoc: module header is too escaped * #4275: Formats accepted by sphinx.util.i18n.format_date are limited +* #4493: recommonmark raises AttributeError if AutoStructify enabled +* #4209: intersphinx: In link title, "v" should be optional if target has no + version +* #4230: slowdown in writing pages with sphinx 1.6 Testing -------- @@ -250,6 +254,8 @@ Bugs fixed * #4477: Build fails after building specific files * #4449: apidoc: include "empty" packages that contain modules * #3917: citation labels are tranformed to ellipsis +* #4501: graphviz: epub3 validation error caused if graph is not clickable +* #4514: graphviz: workaround for wrong map ID which graphviz generates Testing -------- diff --git a/doc/conf.py b/doc/conf.py index fa82cbfb7..3c8b9eae1 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -3,6 +3,7 @@ # Sphinx documentation build configuration file import re + import sphinx diff --git a/setup.cfg b/setup.cfg index dbef653bc..c993e75ec 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,8 +31,10 @@ directory = sphinx/locale/ [flake8] max-line-length = 95 -ignore = E116,E241,E251,E741 +ignore = E116,E241,E251,E741,I101 exclude = .git,.tox,.venv,tests/*,build/*,doc/_build/*,sphinx/search/*,sphinx/pycode/pgen2/*,doc/ext/example*.py +application-import-names = sphinx +import-order-style = smarkets [flake8:local-plugins] extension = diff --git a/setup.py b/setup.py index 32c6f4d50..7855536e4 100644 --- a/setup.py +++ b/setup.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- -from setuptools import setup, find_packages - import os import sys from distutils import log from distutils.cmd import Command +from setuptools import find_packages, setup + import sphinx with open('README.rst') as f: @@ -48,6 +48,7 @@ extras_require = { 'pytest-cov', 'html5lib', 'flake8>=3.5.0', + 'flake8-import-order', ], 'test:python_version<"3"': [ 'enum34', diff --git a/sphinx/application.py b/sphinx/application.py index 3699bdfeb..43d62a7a8 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -13,38 +13,37 @@ from __future__ import print_function import os +import posixpath import sys import warnings -import posixpath -from os import path from collections import deque - -from six import iteritems, itervalues -from six.moves import cStringIO +from os import path from docutils import nodes from docutils.parsers.rst import directives, roles +from six import iteritems, itervalues +from six.moves import cStringIO import sphinx from sphinx import package_dir, locale from sphinx.config import Config -from sphinx.errors import ( - ApplicationError, ConfigError, ExtensionError, VersionRequirementError) from sphinx.deprecation import RemovedInSphinx20Warning from sphinx.environment import BuildEnvironment +from sphinx.errors import ( + ApplicationError, ConfigError, ExtensionError, VersionRequirementError +) from sphinx.events import EventManager from sphinx.extension import verify_required_extensions from sphinx.locale import __ from sphinx.registry import SphinxComponentRegistry -from sphinx.util import pycompat # noqa: F401 from sphinx.util import import_object from sphinx.util import logging -from sphinx.util.tags import Tags -from sphinx.util.osutil import ENOENT, ensuredir +from sphinx.util import pycompat # noqa: F401 from sphinx.util.console import bold # type: ignore from sphinx.util.docutils import is_html5_writer_available, directive_helper from sphinx.util.i18n import find_catalog_source_files -from sphinx.util.osutil import abspath +from sphinx.util.osutil import ENOENT, abspath, ensuredir +from sphinx.util.tags import Tags if False: # For type annotation diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index 662b94227..907cec92e 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -9,22 +9,17 @@ :license: BSD, see LICENSE for details. """ -from os import path import warnings - -try: - import multiprocessing -except ImportError: - multiprocessing = None +from os import path from docutils import nodes from sphinx.deprecation import RemovedInSphinx20Warning from sphinx.environment.adapters.asset import ImageAdapter from sphinx.util import i18n, path_stabilize, logging, status_iterator -from sphinx.util.osutil import SEP, ensuredir, relative_uri -from sphinx.util.i18n import find_catalog from sphinx.util.console import bold # type: ignore +from sphinx.util.i18n import find_catalog +from sphinx.util.osutil import SEP, ensuredir, relative_uri from sphinx.util.parallel import ParallelTasks, SerialTasks, make_chunks, \ parallel_available @@ -32,6 +27,11 @@ from sphinx.util.parallel import ParallelTasks, SerialTasks, make_chunks, \ from sphinx import roles # noqa from sphinx import directives # noqa +try: + import multiprocessing +except ImportError: + multiprocessing = None + if False: # For type annotation from typing import Any, Callable, Dict, Iterable, List, Sequence, Set, Tuple, Union # NOQA diff --git a/sphinx/builders/_epub_base.py b/sphinx/builders/_epub_base.py index f4cb8afa0..a110a873e 100644 --- a/sphinx/builders/_epub_base.py +++ b/sphinx/builders/_epub_base.py @@ -11,18 +11,9 @@ import os import re -from os import path -from sphinx.util.i18n import format_date -from zipfile import ZIP_DEFLATED, ZIP_STORED, ZipFile from collections import namedtuple - -try: - from PIL import Image -except ImportError: - try: - import Image - except ImportError: - Image = None +from os import path +from zipfile import ZIP_DEFLATED, ZIP_STORED, ZipFile from docutils import nodes from docutils.utils import smartquotes @@ -31,8 +22,17 @@ from sphinx import addnodes from sphinx.builders.html import StandaloneHTMLBuilder from sphinx.util import logging from sphinx.util import status_iterator -from sphinx.util.osutil import ensuredir, copyfile from sphinx.util.fileutil import copy_asset_file +from sphinx.util.i18n import format_date +from sphinx.util.osutil import ensuredir, copyfile + +try: + from PIL import Image +except ImportError: + try: + import Image + except ImportError: + Image = None if False: # For type annotation diff --git a/sphinx/builders/applehelp.py b/sphinx/builders/applehelp.py index 0426be331..d7974696c 100644 --- a/sphinx/builders/applehelp.py +++ b/sphinx/builders/applehelp.py @@ -12,22 +12,20 @@ from __future__ import print_function import codecs import pipes - -from os import path, environ +import plistlib import shlex +import subprocess +from os import path, environ from sphinx.builders.html import StandaloneHTMLBuilder from sphinx.config import string_classes +from sphinx.errors import SphinxError from sphinx.util import logging -from sphinx.util.osutil import copyfile, ensuredir, make_filename from sphinx.util.console import bold # type: ignore from sphinx.util.fileutil import copy_asset -from sphinx.util.pycompat import htmlescape from sphinx.util.matching import Matcher -from sphinx.errors import SphinxError - -import plistlib -import subprocess +from sphinx.util.osutil import copyfile, ensuredir, make_filename +from sphinx.util.pycompat import htmlescape if False: # For type annotation diff --git a/sphinx/builders/changes.py b/sphinx/builders/changes.py index ff80250a3..e8b6650cb 100644 --- a/sphinx/builders/changes.py +++ b/sphinx/builders/changes.py @@ -15,13 +15,13 @@ from os import path from six import iteritems from sphinx import package_dir +from sphinx.builders import Builder from sphinx.locale import _ from sphinx.theming import HTMLThemeFactory -from sphinx.builders import Builder from sphinx.util import logging -from sphinx.util.osutil import ensuredir, os_path from sphinx.util.console import bold # type: ignore from sphinx.util.fileutil import copy_asset_file +from sphinx.util.osutil import ensuredir, os_path from sphinx.util.pycompat import htmlescape if False: diff --git a/sphinx/builders/devhelp.py b/sphinx/builders/devhelp.py index 4a0d735c1..2559ba778 100644 --- a/sphinx/builders/devhelp.py +++ b/sphinx/builders/devhelp.py @@ -12,17 +12,17 @@ """ from __future__ import absolute_import -import re import gzip +import re from os import path from docutils import nodes from sphinx import addnodes -from sphinx.util import logging -from sphinx.util.osutil import make_filename from sphinx.builders.html import StandaloneHTMLBuilder from sphinx.environment.adapters.indexentries import IndexEntries +from sphinx.util import logging +from sphinx.util.osutil import make_filename try: import xml.etree.ElementTree as etree diff --git a/sphinx/builders/epub3.py b/sphinx/builders/epub3.py index 2a1b743e0..b9f2f6996 100644 --- a/sphinx/builders/epub3.py +++ b/sphinx/builders/epub3.py @@ -10,12 +10,12 @@ :license: BSD, see LICENSE for details. """ -from os import path from collections import namedtuple +from os import path from sphinx import package_dir -from sphinx.config import string_classes, ENUM from sphinx.builders import _epub_base +from sphinx.config import string_classes, ENUM from sphinx.util import logging, xmlname_checker from sphinx.util.fileutil import copy_asset_file from sphinx.util.i18n import format_date @@ -250,9 +250,9 @@ def setup(app): app.add_config_value('epub_max_image_width', 0, 'env') app.add_config_value('epub_show_urls', 'inline', 'html') app.add_config_value('epub_use_index', lambda self: self.html_use_index, 'html') - app.add_config_value('epub_description', 'unknown', 'epub3', string_classes) - app.add_config_value('epub_contributor', 'unknown', 'epub3', string_classes) - app.add_config_value('epub_writing_mode', 'horizontal', 'epub3', + app.add_config_value('epub_description', 'unknown', 'epub', string_classes) + app.add_config_value('epub_contributor', 'unknown', 'epub', string_classes) + app.add_config_value('epub_writing_mode', 'horizontal', 'epub', ENUM('horizontal', 'vertical')) return { diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py index f7f0d6811..6f38816df 100644 --- a/sphinx/builders/gettext.py +++ b/sphinx/builders/gettext.py @@ -11,23 +11,23 @@ from __future__ import unicode_literals -from os import path, walk, getenv from codecs import open -from time import time -from datetime import datetime, tzinfo, timedelta from collections import defaultdict +from datetime import datetime, tzinfo, timedelta +from os import path, walk, getenv +from time import time from uuid import uuid4 from six import iteritems, StringIO from sphinx.builders import Builder +from sphinx.locale import pairindextypes from sphinx.util import split_index_msg, logging, status_iterator -from sphinx.util.tags import Tags +from sphinx.util.console import bold # type: ignore +from sphinx.util.i18n import find_catalog from sphinx.util.nodes import extract_messages, traverse_translatable_index from sphinx.util.osutil import safe_relpath, ensuredir, canon_path -from sphinx.util.i18n import find_catalog -from sphinx.util.console import bold # type: ignore -from sphinx.locale import pairindextypes +from sphinx.util.tags import Tags if False: # For type annotation diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index c53a01406..bb6818af7 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -9,48 +9,47 @@ :license: BSD, see LICENSE for details. """ +import codecs +import posixpath import re import sys -import codecs import warnings -import posixpath -from os import path from hashlib import md5 - -from six import iteritems, text_type, string_types -from six.moves import cPickle as pickle +from os import path import docutils from docutils import nodes -from docutils.io import DocTreeInput, StringOutput from docutils.core import Publisher -from docutils.utils import new_document, relative_path from docutils.frontend import OptionParser +from docutils.io import DocTreeInput, StringOutput from docutils.readers.doctree import Reader as DoctreeReader +from docutils.utils import relative_path +from six import iteritems, text_type, string_types +from six.moves import cPickle as pickle from sphinx import package_dir, __display_version__ -from sphinx.util import jsonimpl, logging, status_iterator -from sphinx.util.i18n import format_date -from sphinx.util.inventory import InventoryFile -from sphinx.util.osutil import SEP, os_path, relative_uri, ensuredir, \ - movefile, copyfile -from sphinx.util.nodes import inline_all_toctrees -from sphinx.util.docutils import is_html5_writer_available -from sphinx.util.fileutil import copy_asset -from sphinx.util.matching import patmatch, Matcher, DOTFILES +from sphinx.application import ENV_PICKLE_FILENAME +from sphinx.builders import Builder from sphinx.config import string_classes from sphinx.deprecation import RemovedInSphinx20Warning +from sphinx.environment.adapters.asset import ImageAdapter +from sphinx.environment.adapters.indexentries import IndexEntries +from sphinx.environment.adapters.toctree import TocTree +from sphinx.highlighting import PygmentsBridge from sphinx.locale import _, l_ from sphinx.search import js_index from sphinx.theming import HTMLThemeFactory -from sphinx.builders import Builder -from sphinx.application import ENV_PICKLE_FILENAME -from sphinx.highlighting import PygmentsBridge +from sphinx.util import jsonimpl, logging, status_iterator from sphinx.util.console import bold, darkgreen # type: ignore +from sphinx.util.docutils import is_html5_writer_available, new_document +from sphinx.util.fileutil import copy_asset +from sphinx.util.i18n import format_date +from sphinx.util.inventory import InventoryFile +from sphinx.util.matching import patmatch, Matcher, DOTFILES +from sphinx.util.nodes import inline_all_toctrees +from sphinx.util.osutil import SEP, os_path, relative_uri, ensuredir, \ + movefile, copyfile from sphinx.writers.html import HTMLWriter, HTMLTranslator -from sphinx.environment.adapters.asset import ImageAdapter -from sphinx.environment.adapters.toctree import TocTree -from sphinx.environment.adapters.indexentries import IndexEntries if False: # For type annotation @@ -189,6 +188,10 @@ class BuildInfo(object): return (self.config_hash == other.config_hash and self.tags_hash == other.tags_hash) + def __ne__(self, other): # type: ignore + # type: (BuildInfo) -> bool + return not (self == other) # for py27 + def dump(self, f): # type: (IO) -> None f.write('# Sphinx build info version 1\n' diff --git a/sphinx/builders/htmlhelp.py b/sphinx/builders/htmlhelp.py index 63fba05f3..ac32a42db 100644 --- a/sphinx/builders/htmlhelp.py +++ b/sphinx/builders/htmlhelp.py @@ -11,8 +11,8 @@ """ from __future__ import print_function -import os import codecs +import os from os import path from docutils import nodes diff --git a/sphinx/builders/latex.py b/sphinx/builders/latex.py index 0c18b2901..912c40b44 100644 --- a/sphinx/builders/latex.py +++ b/sphinx/builders/latex.py @@ -12,25 +12,24 @@ import os from os import path +from docutils import nodes +from docutils.frontend import OptionParser +from docutils.io import FileOutput from six import text_type -from docutils import nodes -from docutils.io import FileOutput -from docutils.utils import new_document -from docutils.frontend import OptionParser - from sphinx import package_dir, addnodes, highlighting -from sphinx.config import string_classes, ENUM -from sphinx.errors import SphinxError, ConfigError -from sphinx.locale import _ from sphinx.builders import Builder +from sphinx.config import string_classes, ENUM from sphinx.environment import NoUri from sphinx.environment.adapters.asset import ImageAdapter +from sphinx.errors import SphinxError, ConfigError +from sphinx.locale import _ from sphinx.util import texescape, logging, status_iterator -from sphinx.util.nodes import inline_all_toctrees -from sphinx.util.fileutil import copy_asset_file -from sphinx.util.osutil import SEP, make_filename from sphinx.util.console import bold, darkgreen # type: ignore +from sphinx.util.docutils import new_document +from sphinx.util.fileutil import copy_asset_file +from sphinx.util.nodes import inline_all_toctrees +from sphinx.util.osutil import SEP, make_filename from sphinx.writers.latex import LaTeXWriter, LaTeXTranslator if False: diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index c1a47607b..8a10a4f2c 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -9,16 +9,16 @@ :license: BSD, see LICENSE for details. """ +import codecs import re import socket -import codecs import threading from os import path +from docutils import nodes from requests.exceptions import HTTPError from six.moves import queue, html_parser from six.moves.urllib.parse import unquote -from docutils import nodes # 2015-06-25 barry@python.org. This exception was deprecated in Python 3.3 and # removed in Python 3.5, however for backward compatibility reasons, we're not diff --git a/sphinx/builders/manpage.py b/sphinx/builders/manpage.py index 8f7800846..7a691ccf0 100644 --- a/sphinx/builders/manpage.py +++ b/sphinx/builders/manpage.py @@ -11,18 +11,17 @@ from os import path -from six import string_types - -from docutils.io import FileOutput from docutils.frontend import OptionParser +from docutils.io import FileOutput +from six import string_types from sphinx import addnodes from sphinx.builders import Builder from sphinx.environment import NoUri from sphinx.util import logging +from sphinx.util.console import bold, darkgreen # type: ignore from sphinx.util.nodes import inline_all_toctrees from sphinx.util.osutil import make_filename -from sphinx.util.console import bold, darkgreen # type: ignore from sphinx.writers.manpage import ManualPageWriter, ManualPageTranslator if False: diff --git a/sphinx/builders/qthelp.py b/sphinx/builders/qthelp.py index 9d08df2a3..776a2d142 100644 --- a/sphinx/builders/qthelp.py +++ b/sphinx/builders/qthelp.py @@ -9,15 +9,14 @@ :license: BSD, see LICENSE for details. """ -import os -import re import codecs +import os import posixpath +import re from os import path -from six import text_type - from docutils import nodes +from six import text_type from sphinx import addnodes from sphinx.builders.html import StandaloneHTMLBuilder diff --git a/sphinx/builders/texinfo.py b/sphinx/builders/texinfo.py index 39653c117..c9a95a5fc 100644 --- a/sphinx/builders/texinfo.py +++ b/sphinx/builders/texinfo.py @@ -13,21 +13,21 @@ import os from os import path from docutils import nodes -from docutils.io import FileOutput -from docutils.utils import new_document from docutils.frontend import OptionParser +from docutils.io import FileOutput from sphinx import addnodes -from sphinx.locale import _ from sphinx.builders import Builder from sphinx.environment import NoUri from sphinx.environment.adapters.asset import ImageAdapter +from sphinx.locale import _ from sphinx.util import logging from sphinx.util import status_iterator +from sphinx.util.console import bold, darkgreen # type: ignore +from sphinx.util.docutils import new_document from sphinx.util.fileutil import copy_asset_file from sphinx.util.nodes import inline_all_toctrees from sphinx.util.osutil import SEP, make_filename -from sphinx.util.console import bold, darkgreen # type: ignore from sphinx.writers.texinfo import TexinfoWriter, TexinfoTranslator if False: diff --git a/sphinx/cmd/quickstart.py b/sphinx/cmd/quickstart.py index fd9b15649..395c33245 100644 --- a/sphinx/cmd/quickstart.py +++ b/sphinx/cmd/quickstart.py @@ -8,8 +8,8 @@ :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -from __future__ import print_function from __future__ import absolute_import +from __future__ import print_function import argparse import os @@ -30,18 +30,18 @@ try: except ImportError: pass +from docutils.utils import column_width from six import PY2, PY3, text_type, binary_type from six.moves import input from six.moves.urllib.parse import quote as urlquote -from docutils.utils import column_width from sphinx import __display_version__, package_dir -from sphinx.util.osutil import ensuredir, make_filename +from sphinx.util import texescape from sphinx.util.console import ( # type: ignore purple, bold, red, turquoise, nocolor, color_terminal ) +from sphinx.util.osutil import ensuredir, make_filename from sphinx.util.template import SphinxRenderer -from sphinx.util import texescape if False: # For type annotation diff --git a/sphinx/cmdline.py b/sphinx/cmdline.py index 264ee30fe..848dbc789 100644 --- a/sphinx/cmdline.py +++ b/sphinx/cmdline.py @@ -11,8 +11,8 @@ from __future__ import print_function import argparse -import os import multiprocessing +import os import sys import traceback @@ -20,8 +20,8 @@ from docutils.utils import SystemMessage from six import text_type, binary_type from sphinx import __display_version__ -from sphinx.errors import SphinxError from sphinx.application import Sphinx +from sphinx.errors import SphinxError from sphinx.util import Tee, format_exception_cut_frames, save_traceback from sphinx.util.console import red, nocolor, color_terminal # type: ignore from sphinx.util.docutils import docutils_namespace, patch_docutils diff --git a/sphinx/config.py b/sphinx/config.py index ad08b4ca4..0e675423e 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -11,11 +11,11 @@ import re import traceback -from os import path, getenv from collections import OrderedDict +from os import path, getenv +from typing import Any, NamedTuple, Union from six import PY2, PY3, iteritems, string_types, binary_type, text_type, integer_types -from typing import Any, NamedTuple, Union from sphinx.errors import ConfigError from sphinx.locale import l_, __ diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py index b951e704d..ae67cf4c6 100644 --- a/sphinx/directives/code.py +++ b/sphinx/directives/code.py @@ -7,8 +7,8 @@ :license: BSD, see LICENSE for details. """ -import sys import codecs +import sys from difflib import unified_diff from docutils import nodes diff --git a/sphinx/directives/other.py b/sphinx/directives/other.py index 4ce709a63..4d983185f 100644 --- a/sphinx/directives/other.py +++ b/sphinx/directives/other.py @@ -7,20 +7,19 @@ :license: BSD, see LICENSE for details. """ -from six.moves import range - from docutils import nodes from docutils.parsers.rst import Directive, directives from docutils.parsers.rst.directives.admonitions import BaseAdmonition from docutils.parsers.rst.directives.misc import Class from docutils.parsers.rst.directives.misc import Include as BaseInclude +from six.moves import range from sphinx import addnodes from sphinx.locale import versionlabels, _ from sphinx.util import url_re, docname_join +from sphinx.util.matching import patfilter from sphinx.util.nodes import explicit_title_re, set_source_info, \ process_index_entry -from sphinx.util.matching import patfilter if False: # For type annotation diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py index 1bfdf0b11..ca55b6960 100644 --- a/sphinx/domains/c.py +++ b/sphinx/domains/c.py @@ -15,12 +15,12 @@ import string from docutils import nodes from sphinx import addnodes -from sphinx.roles import XRefRole -from sphinx.locale import l_, _ -from sphinx.domains import Domain, ObjType from sphinx.directives import ObjectDescription -from sphinx.util.nodes import make_refnode +from sphinx.domains import Domain, ObjType +from sphinx.locale import l_, _ +from sphinx.roles import XRefRole from sphinx.util.docfields import Field, TypedField +from sphinx.util.nodes import make_refnode if False: # For type annotation diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index b8fa68056..c4a390553 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -12,21 +12,20 @@ import re from copy import deepcopy -from six import iteritems, text_type - from docutils import nodes from docutils.parsers.rst import Directive, directives +from six import iteritems, text_type from sphinx import addnodes -from sphinx.environment import NoUri -from sphinx.roles import XRefRole -from sphinx.locale import l_, _ -from sphinx.domains import Domain, ObjType from sphinx.directives import ObjectDescription +from sphinx.domains import Domain, ObjType +from sphinx.environment import NoUri +from sphinx.locale import l_, _ +from sphinx.roles import XRefRole from sphinx.util import logging +from sphinx.util.docfields import Field, GroupedField from sphinx.util.nodes import make_refnode from sphinx.util.pycompat import UnicodeMixin -from sphinx.util.docfields import Field, GroupedField if False: diff --git a/sphinx/domains/javascript.py b/sphinx/domains/javascript.py index 85954613a..8c1e48fbb 100644 --- a/sphinx/domains/javascript.py +++ b/sphinx/domains/javascript.py @@ -13,13 +13,13 @@ from docutils import nodes from docutils.parsers.rst import Directive, directives from sphinx import addnodes -from sphinx.domains import Domain, ObjType -from sphinx.locale import l_, _ from sphinx.directives import ObjectDescription -from sphinx.roles import XRefRole +from sphinx.domains import Domain, ObjType from sphinx.domains.python import _pseudo_parse_arglist -from sphinx.util.nodes import make_refnode +from sphinx.locale import l_, _ +from sphinx.roles import XRefRole from sphinx.util.docfields import Field, GroupedField, TypedField +from sphinx.util.nodes import make_refnode if False: # For type annotation diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index b0e783b33..a173c8108 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -11,19 +11,18 @@ import re -from six import iteritems - from docutils import nodes from docutils.parsers.rst import Directive, directives +from six import iteritems from sphinx import addnodes -from sphinx.roles import XRefRole -from sphinx.locale import l_, _ -from sphinx.domains import Domain, ObjType, Index from sphinx.directives import ObjectDescription +from sphinx.domains import Domain, ObjType, Index +from sphinx.locale import l_, _ +from sphinx.roles import XRefRole from sphinx.util import logging -from sphinx.util.nodes import make_refnode from sphinx.util.docfields import Field, GroupedField, TypedField +from sphinx.util.nodes import make_refnode if False: # For type annotation diff --git a/sphinx/domains/rst.py b/sphinx/domains/rst.py index 5d876568e..fc533145c 100644 --- a/sphinx/domains/rst.py +++ b/sphinx/domains/rst.py @@ -14,9 +14,9 @@ import re from six import iteritems from sphinx import addnodes +from sphinx.directives import ObjectDescription from sphinx.domains import Domain, ObjType from sphinx.locale import l_, _ -from sphinx.directives import ObjectDescription from sphinx.roles import XRefRole from sphinx.util.nodes import make_refnode diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index 6ea01dd47..ee38c4396 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -12,17 +12,16 @@ import re import unicodedata -from six import iteritems - from docutils import nodes from docutils.parsers.rst import Directive, directives from docutils.statemachine import ViewList +from six import iteritems from sphinx import addnodes -from sphinx.roles import XRefRole -from sphinx.locale import l_, _ -from sphinx.domains import Domain, ObjType from sphinx.directives import ObjectDescription +from sphinx.domains import Domain, ObjType +from sphinx.locale import l_, _ +from sphinx.roles import XRefRole from sphinx.util import ws_re, logging, docname_join from sphinx.util.nodes import clean_astext, make_refnode diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py index 86b2e5fba..cc99be76b 100644 --- a/sphinx/environment/__init__.py +++ b/sphinx/environment/__init__.py @@ -9,40 +9,39 @@ :license: BSD, see LICENSE for details. """ -import re +import fnmatch import os +import re import sys import time import types -import fnmatch import warnings -from os import path -from copy import copy from collections import defaultdict +from copy import copy +from os import path +from docutils.frontend import OptionParser +from docutils.utils import Reporter, get_source_line from six import BytesIO, itervalues, class_types, next from six.moves import cPickle as pickle -from docutils.utils import Reporter, get_source_line -from docutils.frontend import OptionParser - from sphinx import addnodes, versioning -from sphinx.io import read_doc -from sphinx.util import logging, rst -from sphinx.util import get_matching_docs, FilenameUniqDict, status_iterator -from sphinx.util.nodes import is_translatable -from sphinx.util.osutil import SEP, ensuredir -from sphinx.util.i18n import find_catalog_files -from sphinx.util.console import bold # type: ignore -from sphinx.util.docutils import sphinx_domains, WarningStream -from sphinx.util.matching import compile_matchers -from sphinx.util.parallel import ParallelTasks, parallel_available, make_chunks -from sphinx.util.websupport import is_commentable -from sphinx.errors import SphinxError, ExtensionError -from sphinx.transforms import SphinxTransformer from sphinx.deprecation import RemovedInSphinx20Warning from sphinx.environment.adapters.indexentries import IndexEntries from sphinx.environment.adapters.toctree import TocTree +from sphinx.errors import SphinxError, ExtensionError +from sphinx.io import read_doc +from sphinx.transforms import SphinxTransformer +from sphinx.util import get_matching_docs, FilenameUniqDict, status_iterator +from sphinx.util import logging, rst +from sphinx.util.console import bold # type: ignore +from sphinx.util.docutils import sphinx_domains, WarningStream +from sphinx.util.i18n import find_catalog_files +from sphinx.util.matching import compile_matchers +from sphinx.util.nodes import is_translatable +from sphinx.util.osutil import SEP, ensuredir +from sphinx.util.parallel import ParallelTasks, parallel_available, make_chunks +from sphinx.util.websupport import is_commentable if False: # For type annotation @@ -59,7 +58,9 @@ default_settings = { 'embed_stylesheet': False, 'cloak_email_addresses': True, 'pep_base_url': 'https://www.python.org/dev/peps/', + 'pep_references': None, 'rfc_base_url': 'https://tools.ietf.org/html/', + 'rfc_references': None, 'input_encoding': 'utf-8-sig', 'doctitle_xform': False, 'sectsubtitle_xform': False, diff --git a/sphinx/environment/adapters/indexentries.py b/sphinx/environment/adapters/indexentries.py index 4a39b1bd0..5ac8ff1d6 100644 --- a/sphinx/environment/adapters/indexentries.py +++ b/sphinx/environment/adapters/indexentries.py @@ -8,8 +8,8 @@ :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import re import bisect +import re import unicodedata from itertools import groupby diff --git a/sphinx/environment/adapters/toctree.py b/sphinx/environment/adapters/toctree.py index bf725b619..870c7995f 100644 --- a/sphinx/environment/adapters/toctree.py +++ b/sphinx/environment/adapters/toctree.py @@ -9,9 +9,8 @@ :license: BSD, see LICENSE for details. """ -from six import iteritems - from docutils import nodes +from six import iteritems from sphinx import addnodes from sphinx.util import url_re, logging diff --git a/sphinx/environment/collectors/asset.py b/sphinx/environment/collectors/asset.py index 0d7a193e3..2504a7ea4 100644 --- a/sphinx/environment/collectors/asset.py +++ b/sphinx/environment/collectors/asset.py @@ -10,13 +10,12 @@ """ import os -from os import path from glob import glob - -from six import iteritems, itervalues +from os import path from docutils import nodes from docutils.utils import relative_path +from six import iteritems, itervalues from sphinx import addnodes from sphinx.environment.collectors import EnvironmentCollector diff --git a/sphinx/environment/collectors/dependencies.py b/sphinx/environment/collectors/dependencies.py index bf42b12e9..de0b7c080 100644 --- a/sphinx/environment/collectors/dependencies.py +++ b/sphinx/environment/collectors/dependencies.py @@ -13,8 +13,8 @@ from os import path from docutils.utils import relative_path -from sphinx.util.osutil import getcwd, fs_encoding from sphinx.environment.collectors import EnvironmentCollector +from sphinx.util.osutil import getcwd, fs_encoding if False: # For type annotation diff --git a/sphinx/environment/collectors/indexentries.py b/sphinx/environment/collectors/indexentries.py index f9fa8bab7..dec5dbc75 100644 --- a/sphinx/environment/collectors/indexentries.py +++ b/sphinx/environment/collectors/indexentries.py @@ -10,8 +10,8 @@ """ from sphinx import addnodes -from sphinx.util import split_index_msg, logging from sphinx.environment.collectors import EnvironmentCollector +from sphinx.util import split_index_msg, logging if False: # For type annotation diff --git a/sphinx/environment/collectors/toctree.py b/sphinx/environment/collectors/toctree.py index 53e1045d9..a7556eadd 100644 --- a/sphinx/environment/collectors/toctree.py +++ b/sphinx/environment/collectors/toctree.py @@ -9,15 +9,14 @@ :license: BSD, see LICENSE for details. """ +from docutils import nodes from six import iteritems -from docutils import nodes - from sphinx import addnodes -from sphinx.util import url_re, logging -from sphinx.transforms import SphinxContentsFilter from sphinx.environment.adapters.toctree import TocTree from sphinx.environment.collectors import EnvironmentCollector +from sphinx.transforms import SphinxContentsFilter +from sphinx.util import url_re, logging if False: # For type annotation diff --git a/sphinx/ext/apidoc.py b/sphinx/ext/apidoc.py index 690bf7700..14207ef37 100644 --- a/sphinx/ext/apidoc.py +++ b/sphinx/ext/apidoc.py @@ -21,9 +21,10 @@ import argparse import glob import os import sys -from os import path -from six import binary_type from fnmatch import fnmatch +from os import path + +from six import binary_type from sphinx import __display_version__ from sphinx.cmd.quickstart import EXTENSIONS diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py index 669074bae..6fa4093ed 100644 --- a/sphinx/ext/autodoc/__init__.py +++ b/sphinx/ext/autodoc/__init__.py @@ -11,29 +11,28 @@ :license: BSD, see LICENSE for details. """ +import inspect import re import sys -import inspect import warnings +from docutils.statemachine import ViewList from six import iteritems, itervalues, text_type, class_types, string_types -from docutils.statemachine import ViewList - import sphinx +from sphinx.application import ExtensionError from sphinx.deprecation import RemovedInSphinx20Warning from sphinx.ext.autodoc.importer import mock, import_object, get_object_members from sphinx.ext.autodoc.importer import _MockImporter # to keep compatibility # NOQA from sphinx.ext.autodoc.inspector import format_annotation, formatargspec # to keep compatibility # NOQA -from sphinx.util import rpartition, force_decode from sphinx.locale import _ from sphinx.pycode import ModuleAnalyzer, PycodeError -from sphinx.application import ExtensionError from sphinx.util import logging +from sphinx.util import rpartition, force_decode +from sphinx.util.docstrings import prepare_docstring from sphinx.util.inspect import Signature, isdescriptor, safe_getmembers, \ safe_getattr, object_description, is_builtin_class_method, \ isenumattribute, isclassmethod, isstaticmethod, getdoc -from sphinx.util.docstrings import prepare_docstring if False: # For type annotation diff --git a/sphinx/ext/autodoc/importer.py b/sphinx/ext/autodoc/importer.py index ee43784ca..618b56378 100644 --- a/sphinx/ext/autodoc/importer.py +++ b/sphinx/ext/autodoc/importer.py @@ -9,10 +9,10 @@ :license: BSD, see LICENSE for details. """ -import sys -import warnings -import traceback import contextlib +import sys +import traceback +import warnings from collections import namedtuple from types import FunctionType, MethodType, ModuleType diff --git a/sphinx/ext/autosectionlabel.py b/sphinx/ext/autosectionlabel.py index fbb7d037f..bebbaa69c 100644 --- a/sphinx/ext/autosectionlabel.py +++ b/sphinx/ext/autosectionlabel.py @@ -10,13 +10,20 @@ """ from docutils import nodes + from sphinx.util import logging from sphinx.util.nodes import clean_astext logger = logging.getLogger(__name__) +if False: + # For type annotation + from typing import Any, Dict # NOQA + from sphinx.application import Sphinx # NOQA + def register_sections_as_label(app, document): + # type: (Sphinx, nodes.Node) -> None labels = app.env.domaindata['std']['labels'] anonlabels = app.env.domaindata['std']['anonlabels'] for node in document.traverse(nodes.section): @@ -38,5 +45,12 @@ def register_sections_as_label(app, document): def setup(app): + # type: (Sphinx) -> Dict[unicode, Any] app.add_config_value('autosectionlabel_prefix_document', False, 'env') app.connect('doctree-read', register_sections_as_label) + + return { + 'version': 'builtin', + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py index 8a939c8bc..5ed0248ce 100644 --- a/sphinx/ext/autosummary/__init__.py +++ b/sphinx/ext/autosummary/__init__.py @@ -53,28 +53,27 @@ :license: BSD, see LICENSE for details. """ +import inspect import os +import posixpath import re import sys -import inspect -import posixpath -from six import string_types from types import ModuleType -from six import text_type - +from docutils import nodes from docutils.parsers.rst import Directive, directives from docutils.statemachine import ViewList -from docutils import nodes +from six import string_types +from six import text_type import sphinx from sphinx import addnodes from sphinx.environment.adapters.toctree import TocTree -from sphinx.util import import_object, rst, logging -from sphinx.pycode import ModuleAnalyzer, PycodeError from sphinx.ext.autodoc import get_documenters from sphinx.ext.autodoc.directive import DocumenterBridge, Options from sphinx.ext.autodoc.importer import import_module +from sphinx.pycode import ModuleAnalyzer, PycodeError +from sphinx.util import import_object, rst, logging if False: # For type annotation diff --git a/sphinx/ext/autosummary/generate.py b/sphinx/ext/autosummary/generate.py index aeffcb564..d9cb7b5df 100644 --- a/sphinx/ext/autosummary/generate.py +++ b/sphinx/ext/autosummary/generate.py @@ -34,8 +34,8 @@ from sphinx import package_dir from sphinx.ext.autosummary import import_by_name, get_documenter from sphinx.jinja2glue import BuiltinTemplateLoader from sphinx.registry import SphinxComponentRegistry -from sphinx.util.osutil import ensuredir from sphinx.util.inspect import safe_getattr +from sphinx.util.osutil import ensuredir from sphinx.util.rst import escape as rst_escape if False: @@ -170,7 +170,7 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst', except TemplateNotFound: template = template_env.get_template('autosummary/base.rst') - def get_members(obj, typ, include_public=[], imported=False): + def get_members(obj, typ, include_public=[], imported=True): # type: (Any, unicode, List[unicode], bool) -> Tuple[List[unicode], List[unicode]] # NOQA items = [] # type: List[unicode] for name in dir(obj): @@ -180,9 +180,7 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst', continue documenter = get_documenter(app, value, obj) if documenter.objtype == typ: - if typ == 'method': - items.append(name) - elif imported or getattr(value, '__module__', None) == obj.__name__: + if imported or getattr(value, '__module__', None) == obj.__name__: # skip imported members if expected items.append(name) public = [x for x in items @@ -202,9 +200,9 @@ def generate_autosummary_docs(sources, output_dir=None, suffix='.rst', elif doc.objtype == 'class': ns['members'] = dir(obj) ns['methods'], ns['all_methods'] = \ - get_members(obj, 'method', ['__init__'], imported=imported_members) + get_members(obj, 'method', ['__init__']) ns['attributes'], ns['all_attributes'] = \ - get_members(obj, 'attribute', imported=imported_members) + get_members(obj, 'attribute') parts = name.split('.') if doc.objtype in ('method', 'attribute'): diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index 74d004ad1..6c9acfc7d 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -10,9 +10,9 @@ :license: BSD, see LICENSE for details. """ -import re import glob import inspect +import re from os import path from six import iteritems diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py index d0614718b..24e2b2b9e 100644 --- a/sphinx/ext/doctest.py +++ b/sphinx/ext/doctest.py @@ -11,27 +11,26 @@ """ from __future__ import absolute_import +import codecs +import doctest import re import sys import time -import codecs from os import path -import doctest - -from six import itervalues, StringIO, binary_type, text_type, PY2 -from packaging.specifiers import SpecifierSet, InvalidSpecifier -from packaging.version import Version from docutils import nodes from docutils.parsers.rst import Directive, directives +from packaging.specifiers import SpecifierSet, InvalidSpecifier +from packaging.version import Version +from six import itervalues, StringIO, binary_type, text_type, PY2 import sphinx from sphinx.builders import Builder -from sphinx.util import force_decode, logging -from sphinx.util.nodes import set_source_info -from sphinx.util.console import bold # type: ignore -from sphinx.util.osutil import fs_encoding from sphinx.locale import _ +from sphinx.util import force_decode, logging +from sphinx.util.console import bold # type: ignore +from sphinx.util.nodes import set_source_info +from sphinx.util.osutil import fs_encoding if False: # For type annotation diff --git a/sphinx/ext/extlinks.py b/sphinx/ext/extlinks.py index dd721759e..020e829a0 100644 --- a/sphinx/ext/extlinks.py +++ b/sphinx/ext/extlinks.py @@ -24,8 +24,8 @@ :license: BSD, see LICENSE for details. """ -from six import iteritems from docutils import nodes, utils +from six import iteritems import sphinx from sphinx.util.nodes import split_explicit_title diff --git a/sphinx/ext/githubpages.py b/sphinx/ext/githubpages.py index 7d673a72d..b267b1740 100644 --- a/sphinx/ext/githubpages.py +++ b/sphinx/ext/githubpages.py @@ -10,6 +10,7 @@ """ import os + import sphinx diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index 546594843..2986bf9c1 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -10,18 +10,17 @@ :license: BSD, see LICENSE for details. """ -import re import codecs import posixpath +import re +from hashlib import sha1 from os import path from subprocess import Popen, PIPE -from hashlib import sha1 - -from six import text_type from docutils import nodes from docutils.parsers.rst import Directive, directives from docutils.statemachine import ViewList +from six import text_type import sphinx from sphinx.errors import SphinxError @@ -38,13 +37,54 @@ if False: logger = logging.getLogger(__name__) -mapname_re = re.compile(r' None + self.id = None # type: unicode + self.filename = filename + self.content = content.splitlines() + self.clickable = [] # type: List[unicode] + + self.parse(dot=dot) + + def parse(self, dot=None): + # type: (unicode) -> None + matched = self.maptag_re.match(self.content[0]) # type: ignore + if not matched: + raise GraphvizError('Invalid clickable map file found: %s' % self.filename) + + self.id = matched.group(1) + if self.id == '%3': + # graphviz generates wrong ID if graph name not specified + # https://gitlab.com/graphviz/graphviz/issues/1327 + hashed = sha1(dot.encode('utf-8')).hexdigest() + self.id = 'grapviz%s' % hashed[-10:] + self.content[0] = self.content[0].replace('%3', self.id) + + for line in self.content: + if self.href_re.search(line): # type: ignore + self.clickable.append(line) + + def generate_clickable_map(self): + # type: () -> unicode + """Generate clickable map tags if clickable item exists. + + If not exists, this only returns empty string. + """ + if self.clickable: + return '\n'.join([self.content[0]] + self.clickable + [self.content[-1]]) + else: + return '' + + class graphviz(nodes.General, nodes.Inline, nodes.Element): pass @@ -254,18 +294,17 @@ def render_dot_html(self, node, code, options, prefix='graphviz',

%s

\n''' % (fname, alt) self.body.append(svgtag) else: - with open(outfn + '.map', 'rb') as mapfile: - imgmap = mapfile.readlines() - if len(imgmap) == 2: - # nothing in image map (the lines are and ) - self.body.append('%s\n' % - (fname, alt, imgcss)) - else: - # has a map: get the name of the map and connect the parts - mapname = mapname_re.match(imgmap[0].decode('utf-8')).group(1) # type: ignore - self.body.append('%s\n' % - (fname, alt, mapname, imgcss)) - self.body.extend([item.decode('utf-8') for item in imgmap]) + with codecs.open(outfn + '.map', 'r', encoding='utf-8') as mapfile: # type: ignore + imgmap = ClickableMapDefinition(outfn + '.map', mapfile.read(), dot=code) + if imgmap.clickable: + # has a map + self.body.append('%s\n' % + (fname, alt, imgmap.id, imgcss)) + self.body.append(imgmap.generate_clickable_map()) + else: + # nothing in image map + self.body.append('%s\n' % + (fname, alt, imgcss)) if 'align' in node: self.body.append('\n') diff --git a/sphinx/ext/imgmath.py b/sphinx/ext/imgmath.py index b5f67e713..5f9d7a1e2 100644 --- a/sphinx/ext/imgmath.py +++ b/sphinx/ext/imgmath.py @@ -9,28 +9,27 @@ :license: BSD, see LICENSE for details. """ -import re import codecs +import posixpath +import re import shutil import tempfile -import posixpath +from hashlib import sha1 from os import path from subprocess import Popen, PIPE -from hashlib import sha1 - -from six import text_type from docutils import nodes +from six import text_type import sphinx -from sphinx.locale import _ from sphinx.errors import SphinxError, ExtensionError -from sphinx.util import logging -from sphinx.util.png import read_png_depth, write_png_depth -from sphinx.util.osutil import ensuredir, ENOENT, cd -from sphinx.util.pycompat import sys_encoding -from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath from sphinx.ext.mathbase import get_node_equation_number +from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath +from sphinx.locale import _ +from sphinx.util import logging +from sphinx.util.osutil import ensuredir, ENOENT, cd +from sphinx.util.png import read_png_depth, write_png_depth +from sphinx.util.pycompat import sys_encoding if False: # For type annotation diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index d9affb804..7a1366b26 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -36,16 +36,15 @@ r""" :license: BSD, see LICENSE for details. """ +import inspect import re import sys -import inspect from hashlib import md5 -from six import text_type -from six.moves import builtins - from docutils import nodes from docutils.parsers.rst import Directive, directives +from six import text_type +from six.moves import builtins import sphinx from sphinx.ext.graphviz import render_dot_html, render_dot_latex, \ diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py index 8f56726b0..5ea150084 100644 --- a/sphinx/ext/intersphinx.py +++ b/sphinx/ext/intersphinx.py @@ -26,21 +26,20 @@ from __future__ import print_function -import sys -import time import functools import posixpath +import sys +import time from os import path -from six import PY3, iteritems, string_types -from six.moves.urllib.parse import urlsplit, urlunsplit - from docutils import nodes from docutils.utils import relative_path +from six import PY3, iteritems, string_types +from six.moves.urllib.parse import urlsplit, urlunsplit import sphinx -from sphinx.locale import _ from sphinx.builders.html import INVENTORY_FILENAME +from sphinx.locale import _ from sphinx.util import requests, logging from sphinx.util.inventory import InventoryFile @@ -316,8 +315,11 @@ def missing_reference(app, env, node, contnode): if '://' not in uri and node.get('refdoc'): # get correct path in case of subdirectories uri = path.join(relative_path(node['refdoc'], '.'), uri) - newnode = nodes.reference('', '', internal=False, refuri=uri, - reftitle=_('(in %s v%s)') % (proj, version)) + if version: + reftitle = _('(in %s v%s)') % (proj, version) + else: + reftitle = _('(in %s)') % (proj,) + newnode = nodes.reference('', '', internal=False, refuri=uri, reftitle=reftitle) if node.get('refexplicit'): # use whatever title was given newnode.append(contnode) diff --git a/sphinx/ext/jsmath.py b/sphinx/ext/jsmath.py index 0858e4d5d..05d5dc290 100644 --- a/sphinx/ext/jsmath.py +++ b/sphinx/ext/jsmath.py @@ -13,10 +13,10 @@ from docutils import nodes import sphinx -from sphinx.locale import _ from sphinx.application import ExtensionError -from sphinx.ext.mathbase import setup_math as mathbase_setup from sphinx.ext.mathbase import get_node_equation_number +from sphinx.ext.mathbase import setup_math as mathbase_setup +from sphinx.locale import _ def html_visit_math(self, node): diff --git a/sphinx/ext/linkcode.py b/sphinx/ext/linkcode.py index a42dab528..af45f32fa 100644 --- a/sphinx/ext/linkcode.py +++ b/sphinx/ext/linkcode.py @@ -13,8 +13,8 @@ from docutils import nodes import sphinx from sphinx import addnodes -from sphinx.locale import _ from sphinx.errors import SphinxError +from sphinx.locale import _ if False: # For type annotation diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py index f773c0d24..013d51c8c 100644 --- a/sphinx/ext/mathbase.py +++ b/sphinx/ext/mathbase.py @@ -14,9 +14,9 @@ from docutils.nodes import make_id from docutils.parsers.rst import Directive, directives from sphinx.config import string_classes -from sphinx.roles import XRefRole -from sphinx.locale import __ from sphinx.domains import Domain +from sphinx.locale import __ +from sphinx.roles import XRefRole from sphinx.util import logging from sphinx.util.nodes import make_refnode, set_source_info diff --git a/sphinx/ext/mathjax.py b/sphinx/ext/mathjax.py index b66baed68..dae099c2e 100644 --- a/sphinx/ext/mathjax.py +++ b/sphinx/ext/mathjax.py @@ -14,10 +14,10 @@ from docutils import nodes import sphinx -from sphinx.locale import _ from sphinx.errors import ExtensionError -from sphinx.ext.mathbase import setup_math as mathbase_setup from sphinx.ext.mathbase import get_node_equation_number +from sphinx.ext.mathbase import setup_math as mathbase_setup +from sphinx.locale import _ def html_visit_math(self, node): diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py index 717d51756..ebb05e615 100644 --- a/sphinx/ext/pngmath.py +++ b/sphinx/ext/pngmath.py @@ -10,27 +10,26 @@ :license: BSD, see LICENSE for details. """ -import re import codecs +import posixpath +import re import shutil import tempfile -import posixpath +from hashlib import sha1 from os import path from subprocess import Popen, PIPE -from hashlib import sha1 - -from six import text_type from docutils import nodes +from six import text_type import sphinx from sphinx.errors import SphinxError, ExtensionError -from sphinx.util import logging -from sphinx.util.png import read_png_depth, write_png_depth -from sphinx.util.osutil import ensuredir, ENOENT, cd -from sphinx.util.pycompat import sys_encoding -from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath from sphinx.ext.mathbase import get_node_equation_number +from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath +from sphinx.util import logging +from sphinx.util.osutil import ensuredir, ENOENT, cd +from sphinx.util.png import read_png_depth, write_png_depth +from sphinx.util.pycompat import sys_encoding if False: # For type annotation diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index 04076169f..f9977421d 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -13,16 +13,16 @@ """ from docutils import nodes +from docutils.parsers.rst import Directive from docutils.parsers.rst import directives +from docutils.parsers.rst.directives.admonitions import BaseAdmonition import sphinx -from sphinx.locale import _ from sphinx.environment import NoUri +from sphinx.locale import _ from sphinx.util import logging from sphinx.util.nodes import set_source_info from sphinx.util.texescape import tex_escape_map -from docutils.parsers.rst import Directive -from docutils.parsers.rst.directives.admonitions import BaseAdmonition if False: # For type annotation diff --git a/sphinx/ext/viewcode.py b/sphinx/ext/viewcode.py index a2e8e64d3..2a152b2af 100644 --- a/sphinx/ext/viewcode.py +++ b/sphinx/ext/viewcode.py @@ -11,9 +11,8 @@ import traceback -from six import iteritems, text_type - from docutils import nodes +from six import iteritems, text_type import sphinx from sphinx import addnodes diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py index eef24ee95..ac1d1118e 100644 --- a/sphinx/highlighting.py +++ b/sphinx/highlighting.py @@ -9,23 +9,22 @@ :license: BSD, see LICENSE for details. """ +from pygments import highlight +from pygments.filters import ErrorToken +from pygments.formatters import HtmlFormatter, LatexFormatter +from pygments.lexer import Lexer # NOQA +from pygments.lexers import get_lexer_by_name, guess_lexer +from pygments.lexers import PythonLexer, Python3Lexer, PythonConsoleLexer, \ + CLexer, TextLexer, RstLexer +from pygments.styles import get_style_by_name +from pygments.util import ClassNotFound from six import text_type +from sphinx.ext import doctest +from sphinx.pygments_styles import SphinxStyle, NoneStyle from sphinx.util import logging from sphinx.util.pycompat import htmlescape from sphinx.util.texescape import tex_hl_escape_map_new -from sphinx.ext import doctest - -from pygments import highlight -from pygments.lexer import Lexer # NOQA -from pygments.lexers import PythonLexer, Python3Lexer, PythonConsoleLexer, \ - CLexer, TextLexer, RstLexer -from pygments.lexers import get_lexer_by_name, guess_lexer -from pygments.formatters import HtmlFormatter, LatexFormatter -from pygments.filters import ErrorToken -from pygments.styles import get_style_by_name -from pygments.util import ClassNotFound -from sphinx.pygments_styles import SphinxStyle, NoneStyle if False: # For type annotation diff --git a/sphinx/io.py b/sphinx/io.py index d4413f357..3a0e19896 100644 --- a/sphinx/io.py +++ b/sphinx/io.py @@ -8,24 +8,24 @@ :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import re import codecs +import re -from docutils.io import FileInput, NullOutput from docutils.core import Publisher +from docutils.io import FileInput, NullOutput from docutils.readers import standalone from docutils.statemachine import StringList, string2lines from docutils.writers import UnfilteredWriter from six import text_type, iteritems from typing import Any, Union # NOQA -from sphinx.transforms import SphinxTransformer from sphinx.transforms import ( ApplySourceWorkaround, ExtraTranslatableNodes, CitationReferences, DefaultSubstitutions, MoveModuleTargets, HandleCodeBlocks, SortIds, AutoNumbering, AutoIndexUpgrader, FilterSystemMessages, UnreferencedFootnotesDetector, SphinxSmartQuotes, ManpageLink ) +from sphinx.transforms import SphinxTransformer from sphinx.transforms.compact_bullet_list import RefOnlyBulletListTransform from sphinx.transforms.i18n import ( PreserveTranslatableMessages, Locale, RemoveTranslatableInline, diff --git a/sphinx/jinja2glue.py b/sphinx/jinja2glue.py index e6f49d18d..cc935d577 100644 --- a/sphinx/jinja2glue.py +++ b/sphinx/jinja2glue.py @@ -11,13 +11,13 @@ from os import path from pprint import pformat +from typing import Any, Callable, Iterator, Tuple # NOQA -from six import string_types from jinja2 import FileSystemLoader, BaseLoader, TemplateNotFound, \ contextfunction -from jinja2.utils import open_if_exists from jinja2.sandbox import SandboxedEnvironment -from typing import Any, Callable, Iterator, Tuple # NOQA +from jinja2.utils import open_if_exists +from six import string_types from sphinx.application import TemplateBridge from sphinx.util.osutil import mtimes_of_files diff --git a/sphinx/make_mode.py b/sphinx/make_mode.py index 4b325160f..78df06107 100644 --- a/sphinx/make_mode.py +++ b/sphinx/make_mode.py @@ -17,8 +17,8 @@ from __future__ import print_function import os -import sys import subprocess +import sys from os import path import sphinx diff --git a/sphinx/pycode/parser.py b/sphinx/pycode/parser.py index 9aed7f7f4..f15da664a 100644 --- a/sphinx/pycode/parser.py +++ b/sphinx/pycode/parser.py @@ -8,11 +8,11 @@ :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import re import ast import inspect -import tokenize import itertools +import re +import tokenize from token import NAME, NEWLINE, INDENT, DEDENT, NUMBER, OP, STRING from tokenize import COMMENT, NL diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index 5e403b1d8..81676e8b1 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -11,8 +11,8 @@ import warnings -from sphinx.deprecation import RemovedInSphinx20Warning from sphinx.cmd.quickstart import main as _main +from sphinx.deprecation import RemovedInSphinx20Warning def main(*args, **kwargs): diff --git a/sphinx/registry.py b/sphinx/registry.py index 042781dfb..24e17ed60 100644 --- a/sphinx/registry.py +++ b/sphinx/registry.py @@ -16,11 +16,11 @@ import warnings from pkg_resources import iter_entry_points from six import iteritems, itervalues -from sphinx.errors import ExtensionError, SphinxError, VersionRequirementError -from sphinx.extension import Extension from sphinx.deprecation import RemovedInSphinx30Warning from sphinx.domains import ObjType from sphinx.domains.std import GenericObject, Target +from sphinx.errors import ExtensionError, SphinxError, VersionRequirementError +from sphinx.extension import Extension from sphinx.locale import __ from sphinx.parsers import Parser as SphinxParser from sphinx.roles import XRefRole diff --git a/sphinx/roles.py b/sphinx/roles.py index 223c6c21f..2971c8fc3 100644 --- a/sphinx/roles.py +++ b/sphinx/roles.py @@ -11,12 +11,12 @@ import re -from six import iteritems from docutils import nodes, utils +from six import iteritems from sphinx import addnodes -from sphinx.locale import _ from sphinx.errors import SphinxError +from sphinx.locale import _ from sphinx.util import ws_re from sphinx.util.nodes import split_explicit_title, process_index_entry, \ set_role_source_info diff --git a/sphinx/setup_command.py b/sphinx/setup_command.py index 3ad16ae78..37fc2d042 100644 --- a/sphinx/setup_command.py +++ b/sphinx/setup_command.py @@ -13,13 +13,13 @@ """ from __future__ import print_function -import sys import os - -from six import StringIO, string_types +import sys from distutils.cmd import Command from distutils.errors import DistutilsOptionError, DistutilsExecError # type: ignore +from six import StringIO, string_types + from sphinx.application import Sphinx from sphinx.cmdline import handle_exception from sphinx.util.console import nocolor, color_terminal diff --git a/sphinx/testing/path.py b/sphinx/testing/path.py index 30c4b49f3..5836d2bc0 100644 --- a/sphinx/testing/path.py +++ b/sphinx/testing/path.py @@ -7,8 +7,8 @@ :license: BSD, see LICENSE for details. """ import os -import sys import shutil +import sys from io import open from six import PY2, text_type diff --git a/sphinx/testing/util.py b/sphinx/testing/util.py index fb2e8f1f5..60544cfa3 100644 --- a/sphinx/testing/util.py +++ b/sphinx/testing/util.py @@ -14,16 +14,14 @@ import sys import warnings from xml.etree import ElementTree -from six import string_types - from docutils import nodes from docutils.parsers.rst import directives, roles +from six import string_types from sphinx import application from sphinx.builders.latex import LaTeXBuilder from sphinx.ext.autodoc import AutoDirective from sphinx.pycode import ModuleAnalyzer - from sphinx.testing.path import path if False: diff --git a/sphinx/transforms/__init__.py b/sphinx/transforms/__init__.py index 8f70fc537..a2e92223d 100644 --- a/sphinx/transforms/__init__.py +++ b/sphinx/transforms/__init__.py @@ -15,12 +15,13 @@ from docutils import nodes from docutils.transforms import Transform, Transformer from docutils.transforms.parts import ContentsFilter from docutils.transforms.universal import SmartQuotes -from docutils.utils import new_document, normalize_language_tag +from docutils.utils import normalize_language_tag from docutils.utils.smartquotes import smartchars from sphinx import addnodes from sphinx.locale import _ from sphinx.util import logging +from sphinx.util.docutils import new_document from sphinx.util.i18n import format_date from sphinx.util.nodes import apply_source_workaround, is_smartquotable diff --git a/sphinx/transforms/i18n.py b/sphinx/transforms/i18n.py index f5ff97e5b..81c11d0ec 100644 --- a/sphinx/transforms/i18n.py +++ b/sphinx/transforms/i18n.py @@ -16,6 +16,9 @@ from docutils.io import StringInput from docutils.utils import relative_path from sphinx import addnodes +from sphinx.domains.std import make_glossary_term, split_term_classifiers +from sphinx.locale import init as init_locale +from sphinx.transforms import SphinxTransform from sphinx.util import split_index_msg, logging from sphinx.util.i18n import find_catalog from sphinx.util.nodes import ( @@ -23,9 +26,6 @@ from sphinx.util.nodes import ( extract_messages, is_pending_meta, traverse_translatable_index, ) from sphinx.util.pycompat import indent -from sphinx.locale import init as init_locale -from sphinx.transforms import SphinxTransform -from sphinx.domains.std import make_glossary_term, split_term_classifiers if False: # For type annotation diff --git a/sphinx/transforms/post_transforms/images.py b/sphinx/transforms/post_transforms/images.py index d09f57e67..b8f4b9a5d 100644 --- a/sphinx/transforms/post_transforms/images.py +++ b/sphinx/transforms/post_transforms/images.py @@ -10,15 +10,15 @@ """ import os -from math import ceil from hashlib import sha1 +from math import ceil -from six import text_type from docutils import nodes +from six import text_type from sphinx.transforms import SphinxTransform -from sphinx.util import logging, requests from sphinx.util import epoch_to_rfc1123, rfc1123_to_epoch +from sphinx.util import logging, requests from sphinx.util.images import guess_mimetype, get_image_extension, parse_data_uri from sphinx.util.osutil import ensuredir, movefile diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 938ec71db..dda3fb04c 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -10,24 +10,24 @@ """ from __future__ import absolute_import +import fnmatch import os +import posixpath import re import sys -import fnmatch import tempfile -import posixpath import traceback import unicodedata +from codecs import BOM_UTF8 +from collections import deque +from datetime import datetime from os import path from time import mktime, strptime -from codecs import BOM_UTF8 -from datetime import datetime -from collections import deque +from docutils.utils import relative_path from six import text_type, binary_type, itervalues from six.moves import range from six.moves.urllib.parse import urlsplit, urlunsplit, quote_plus, parse_qsl, urlencode -from docutils.utils import relative_path from sphinx.errors import PycodeError, SphinxParallelError, ExtensionError from sphinx.util import logging diff --git a/sphinx/util/console.py b/sphinx/util/console.py index 8069dd9c9..7663feb1e 100644 --- a/sphinx/util/console.py +++ b/sphinx/util/console.py @@ -10,8 +10,8 @@ """ import os -import sys import re +import sys try: # check if colorama is installed to support color on Windows diff --git a/sphinx/util/docutils.py b/sphinx/util/docutils.py index 2848bc857..50483d3f1 100644 --- a/sphinx/util/docutils.py +++ b/sphinx/util/docutils.py @@ -12,14 +12,15 @@ from __future__ import absolute_import import re import types +from contextlib import contextmanager from copy import copy from distutils.version import LooseVersion -from contextlib import contextmanager import docutils +from docutils import nodes from docutils.languages import get_language -from docutils.statemachine import StateMachine from docutils.parsers.rst import directives, roles, convert_directive_function +from docutils.statemachine import StateMachine from docutils.utils import Reporter from sphinx.errors import ExtensionError @@ -32,7 +33,6 @@ report_re = re.compile('^(.+?:(?:\\d+)?): \\((DEBUG|INFO|WARNING|ERROR|SEVERE)/( if False: # For type annotation from typing import Any, Callable, Generator, Iterator, List, Tuple # NOQA - from docutils import nodes # NOQA from docutils.statemachine import State, ViewList # NOQA from sphinx.environment import BuildEnvironment # NOQA from sphinx.io import SphinxFileInput # NOQA @@ -221,3 +221,30 @@ def switch_source_input(state, content): finally: # restore the method state.memo.reporter.get_source_and_line = get_source_and_line + + +# cache a vanilla instance of nodes.document +# Used in new_document() function +__document_cache__ = None # type: nodes.document + + +def new_document(source_path, settings=None): + # type: (unicode, Any) -> nodes.document + """Return a new empty document object. This is an alternative of docutils'. + + This is a simple wrapper for ``docutils.utils.new_document()``. It + caches the result of docutils' and use it on second call for instanciation. + This makes an instantiation of document nodes much faster. + """ + global __document_cache__ + if __document_cache__ is None: + __document_cache__ = docutils.utils.new_document(source_path) + + if settings is None: + # Make a copy of ``settings`` from cache to accelerate instansiation + settings = copy(__document_cache__.settings) + + # Create a new instance of nodes.document using cached reporter + document = nodes.document(settings, __document_cache__.reporter, source=source_path) + document.note_source(source_path, -1) + return document diff --git a/sphinx/util/fileutil.py b/sphinx/util/fileutil.py index 3fd570273..7caf40275 100644 --- a/sphinx/util/fileutil.py +++ b/sphinx/util/fileutil.py @@ -10,10 +10,12 @@ """ from __future__ import absolute_import -import os import codecs +import os import posixpath + from docutils.utils import relative_path + from sphinx.util.osutil import copyfile, ensuredir, walk if False: diff --git a/sphinx/util/i18n.py b/sphinx/util/i18n.py index d52cc0aab..4989de1c9 100644 --- a/sphinx/util/i18n.py +++ b/sphinx/util/i18n.py @@ -12,13 +12,13 @@ import gettext import io import os import re -from os import path -from datetime import datetime from collections import namedtuple +from datetime import datetime +from os import path import babel.dates -from babel.messages.pofile import read_po from babel.messages.mofile import write_mo +from babel.messages.pofile import read_po from sphinx.errors import SphinxError from sphinx.util import logging diff --git a/sphinx/util/images.py b/sphinx/util/images.py index 46187775d..dd2f2a9e2 100644 --- a/sphinx/util/images.py +++ b/sphinx/util/images.py @@ -12,13 +12,13 @@ from __future__ import absolute_import import base64 import imghdr -import imagesize -from os import path from collections import OrderedDict - -from six import PY3, BytesIO, iteritems +from os import path from typing import NamedTuple +import imagesize +from six import PY3, BytesIO, iteritems + try: from PIL import Image # check for the Python Imaging Library except ImportError: diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 65005c240..3c3361b99 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -10,10 +10,10 @@ """ from __future__ import absolute_import +import inspect import re import sys import typing -import inspect from collections import OrderedDict from six import PY2, PY3, StringIO, binary_type, string_types, itervalues diff --git a/sphinx/util/inventory.py b/sphinx/util/inventory.py index 837188b5a..ed4e55bc2 100644 --- a/sphinx/util/inventory.py +++ b/sphinx/util/inventory.py @@ -8,8 +8,8 @@ :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import re import os +import re import zlib from six import PY3 diff --git a/sphinx/util/logging.py b/sphinx/util/logging.py index 4835a5755..1ac4fb327 100644 --- a/sphinx/util/logging.py +++ b/sphinx/util/logging.py @@ -12,12 +12,12 @@ from __future__ import absolute_import import logging import logging.handlers -from contextlib import contextmanager from collections import defaultdict +from contextlib import contextmanager -from six import PY2, StringIO from docutils import nodes from docutils.utils import get_source_line +from six import PY2, StringIO from sphinx.errors import SphinxWarning from sphinx.util.console import colorize diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index 64e850c08..3e8e61edf 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -12,9 +12,8 @@ from __future__ import absolute_import import re -from six import text_type - from docutils import nodes +from six import text_type from sphinx import addnodes from sphinx.locale import pairindextypes diff --git a/sphinx/util/osutil.py b/sphinx/util/osutil.py index 3ecfb4a1b..b52fde0d6 100644 --- a/sphinx/util/osutil.py +++ b/sphinx/util/osutil.py @@ -10,17 +10,18 @@ """ from __future__ import print_function +import contextlib +import errno +import filecmp +import locale import os import re +import shutil import sys import time -import errno -import locale -import shutil -import filecmp -from os import path -import contextlib from io import BytesIO, StringIO +from os import path + from six import PY2, PY3, text_type if False: diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py index 6340e4dfc..fe2577308 100644 --- a/sphinx/util/parallel.py +++ b/sphinx/util/parallel.py @@ -13,6 +13,7 @@ import os import time import traceback from math import sqrt + from six import iteritems try: diff --git a/sphinx/util/png.py b/sphinx/util/png.py index d22839fbf..88530d979 100644 --- a/sphinx/util/png.py +++ b/sphinx/util/png.py @@ -9,8 +9,8 @@ :license: BSD, see LICENSE for details. """ -import struct import binascii +import struct LEN_IEND = 12 diff --git a/sphinx/util/pycompat.py b/sphinx/util/pycompat.py index e1a2bad9a..8bcf7e4f8 100644 --- a/sphinx/util/pycompat.py +++ b/sphinx/util/pycompat.py @@ -9,8 +9,8 @@ :license: BSD, see LICENSE for details. """ -import sys import codecs +import sys from six import PY3, text_type, exec_ diff --git a/sphinx/util/requests.py b/sphinx/util/requests.py index 4bd4c042e..b6c0d1ab8 100644 --- a/sphinx/util/requests.py +++ b/sphinx/util/requests.py @@ -14,11 +14,11 @@ from __future__ import absolute_import import warnings from contextlib import contextmanager -import requests import pkg_resources - +import requests from six import string_types from six.moves.urllib.parse import urlsplit + try: from requests.packages.urllib3.exceptions import SSLError except ImportError: diff --git a/sphinx/util/smartypants.py b/sphinx/util/smartypants.py index 291815a26..03fc1816c 100644 --- a/sphinx/util/smartypants.py +++ b/sphinx/util/smartypants.py @@ -28,7 +28,9 @@ from __future__ import absolute_import, unicode_literals import re + from docutils.utils import smartquotes + from sphinx.util.docutils import __version_info__ as docutils_version if False: # For type annotation diff --git a/sphinx/util/tags.py b/sphinx/util/tags.py index 2c4855e91..43a351f65 100644 --- a/sphinx/util/tags.py +++ b/sphinx/util/tags.py @@ -9,8 +9,8 @@ # (ab)use the Jinja parser for parsing our boolean expressions from jinja2 import nodes -from jinja2.parser import Parser from jinja2.environment import Environment +from jinja2.parser import Parser env = Environment() diff --git a/sphinx/util/template.py b/sphinx/util/template.py index a78871349..5a415d329 100644 --- a/sphinx/util/template.py +++ b/sphinx/util/template.py @@ -10,6 +10,7 @@ """ import os + from jinja2.sandbox import SandboxedEnvironment from sphinx import package_dir diff --git a/sphinx/util/typing.py b/sphinx/util/typing.py index 793504b77..3cc4a46b5 100644 --- a/sphinx/util/typing.py +++ b/sphinx/util/typing.py @@ -9,11 +9,11 @@ :license: BSD, see LICENSE for details. """ -from six import PY3 from typing import Callable, Dict, List, Tuple from docutils import nodes from docutils.parsers.rst.states import Inliner +from six import PY3 if PY3: diff --git a/sphinx/versioning.py b/sphinx/versioning.py index 953ef4f6b..bd0928775 100644 --- a/sphinx/versioning.py +++ b/sphinx/versioning.py @@ -9,13 +9,13 @@ :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -from uuid import uuid4 -from operator import itemgetter from itertools import product +from operator import itemgetter +from uuid import uuid4 from six import iteritems -from six.moves import range, zip_longest from six.moves import cPickle as pickle +from six.moves import range, zip_longest from sphinx.transforms import SphinxTransform diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index 16fc69bea..0fc4a7bea 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -9,14 +9,14 @@ :license: BSD, see LICENSE for details. """ -import sys -import posixpath -import os import copy +import os +import posixpath +import sys -from six import string_types from docutils import nodes from docutils.writers.html4css1 import Writer, HTMLTranslator as BaseTranslator +from six import string_types from sphinx import addnodes from sphinx.locale import admonitionlabels, _ diff --git a/sphinx/writers/html5.py b/sphinx/writers/html5.py index c2810a898..21d7626ef 100644 --- a/sphinx/writers/html5.py +++ b/sphinx/writers/html5.py @@ -9,13 +9,13 @@ :license: BSD, see LICENSE for details. """ -import sys -import posixpath import os +import posixpath +import sys -from six import string_types from docutils import nodes from docutils.writers.html5_polyglot import HTMLTranslator as BaseTranslator +from six import string_types from sphinx import addnodes from sphinx.locale import admonitionlabels, _ diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 2d61468d6..c51375872 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -14,12 +14,12 @@ import re import sys -from os import path from collections import defaultdict +from os import path -from six import itervalues, text_type from docutils import nodes, writers from docutils.writers.latex2e import Babel +from six import itervalues, text_type from sphinx import addnodes from sphinx import highlighting diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py index 1d645ce5f..38954ca81 100644 --- a/sphinx/writers/manpage.py +++ b/sphinx/writers/manpage.py @@ -16,10 +16,10 @@ from docutils.writers.manpage import ( Translator as BaseTranslator ) +import sphinx.util.docutils from sphinx import addnodes from sphinx.locale import admonitionlabels, _ from sphinx.util import logging -import sphinx.util.docutils from sphinx.util.i18n import format_date if False: diff --git a/sphinx/writers/texinfo.py b/sphinx/writers/texinfo.py index b73557f86..cce269479 100644 --- a/sphinx/writers/texinfo.py +++ b/sphinx/writers/texinfo.py @@ -13,11 +13,10 @@ import re import textwrap from os import path +from docutils import nodes, writers from six import itervalues from six.moves import range -from docutils import nodes, writers - from sphinx import addnodes, __display_version__ from sphinx.errors import ExtensionError from sphinx.locale import admonitionlabels, _ diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py index dda803025..5e870efa2 100644 --- a/sphinx/writers/text.py +++ b/sphinx/writers/text.py @@ -13,10 +13,9 @@ import re import textwrap from itertools import groupby -from six.moves import zip_longest - from docutils import nodes, writers from docutils.utils import column_width +from six.moves import zip_longest from sphinx import addnodes from sphinx.locale import admonitionlabels, _ diff --git a/tests/roots/test-ext-autosummary/autosummary_dummy_module.py b/tests/roots/test-ext-autosummary/autosummary_dummy_module.py index aa4aaa9f2..c76e73302 100644 --- a/tests/roots/test-ext-autosummary/autosummary_dummy_module.py +++ b/tests/roots/test-ext-autosummary/autosummary_dummy_module.py @@ -7,3 +7,7 @@ class Foo: def bar(self): pass + + @property + def baz(self): + pass diff --git a/tests/test_ext_autosummary.py b/tests/test_ext_autosummary.py index ce5aa6e85..f60886ec9 100644 --- a/tests/test_ext_autosummary.py +++ b/tests/test_ext_autosummary.py @@ -153,6 +153,10 @@ def test_autosummary_generate(app, status, warning): ' ~Foo.__init__\n' ' ~Foo.bar\n' ' \n' in Foo) + assert (' .. autosummary::\n' + ' \n' + ' ~Foo.baz\n' + ' \n' in Foo) def test_import_by_name(): diff --git a/tests/test_ext_graphviz.py b/tests/test_ext_graphviz.py index 762add6f0..ef77135d7 100644 --- a/tests/test_ext_graphviz.py +++ b/tests/test_ext_graphviz.py @@ -13,6 +13,8 @@ import re import pytest +from sphinx.ext.graphviz import ClickableMapDefinition + @pytest.mark.sphinx('html', testroot='ext-graphviz') @pytest.mark.usefixtures('if_graphviz_found') @@ -115,3 +117,63 @@ def test_graphviz_i18n(app, status, warning): content = (app.outdir / 'index.html').text() html = 'digraph {\n  BAR -> BAZ\n}' assert re.search(html, content, re.M) + + +def test_graphviz_parse_mapfile(): + # empty graph + code = ('# digraph {\n' + '# }\n') + content = ('\n' + '') + cmap = ClickableMapDefinition('dummy.map', content, code) + assert cmap.filename == 'dummy.map' + assert cmap.id == 'grapvizb08107169e' + assert len(cmap.clickable) == 0 + assert cmap.generate_clickable_map() == '' + + # normal graph + code = ('digraph {\n' + ' foo [href="http://www.google.com/"];\n' + ' foo -> bar;\n' + '}\n') + content = ('\n' + '\n' + '') + cmap = ClickableMapDefinition('dummy.map', content, code) + assert cmap.filename == 'dummy.map' + assert cmap.id == 'grapviza4ccdd48ce' + assert len(cmap.clickable) == 1 + assert cmap.generate_clickable_map() == content.replace('%3', cmap.id) + + # inheritance-diagram:: sphinx.builders.html + content = ( + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '' + ) + cmap = ClickableMapDefinition('dummy.map', content, 'dummy_code') + assert cmap.filename == 'dummy.map' + assert cmap.id == 'inheritance66ff5471b9' + assert len(cmap.clickable) == 0 + assert cmap.generate_clickable_map() == '' diff --git a/tests/test_ext_intersphinx.py b/tests/test_ext_intersphinx.py index aef495d30..91e21187b 100644 --- a/tests/test_ext_intersphinx.py +++ b/tests/test_ext_intersphinx.py @@ -24,7 +24,7 @@ from sphinx.ext.intersphinx import ( load_mappings, missing_reference, _strip_basic_auth, _get_safe_url, fetch_inventory, INVENTORY_FILENAME, debug ) -from test_util_inventory import inventory_v2 +from test_util_inventory import inventory_v2, inventory_v2_not_having_version def fake_node(domain, type, target, content, **attrs): @@ -271,6 +271,25 @@ def test_missing_reference_jsdomain(tempdir, app, status, warning): assert rn.astext() == 'baz()' +@pytest.mark.xfail(os.name != 'posix', reason="Path separator mismatch issue") +def test_inventory_not_having_version(tempdir, app, status, warning): + inv_file = tempdir / 'inventory' + inv_file.write_bytes(inventory_v2_not_having_version) + app.config.intersphinx_mapping = { + 'https://docs.python.org/': inv_file, + } + app.config.intersphinx_cache_limit = 0 + + # load the inventory and check if it's done correctly + load_mappings(app) + + rn = reference_check(app, 'py', 'mod', 'module1', 'foo') + assert isinstance(rn, nodes.reference) + assert rn['refuri'] == 'https://docs.python.org/foo.html#module-module1' + assert rn['reftitle'] == '(in foo)' + assert rn[0].astext() == 'Long Module desc' + + def test_load_mappings_warnings(tempdir, app, status, warning): """ load_mappings issues a warning if new-style mapping diff --git a/tests/test_util_inventory.py b/tests/test_util_inventory.py index 3829de9ef..3d6c9f402 100644 --- a/tests/test_util_inventory.py +++ b/tests/test_util_inventory.py @@ -50,6 +50,15 @@ foo.bar.qux js:data 1 index.html#foo.bar.qux - a term including:colon std:term -1 glossary.html#term-a-term-including-colon - '''.encode('utf-8')) +inventory_v2_not_having_version = '''\ +# Sphinx inventory version 2 +# Project: foo +# Version: +# The remainder of this file is compressed with zlib. +'''.encode('utf-8') + zlib.compress('''\ +module1 py:module 0 foo.html#module-module1 Long Module desc +'''.encode('utf-8')) + def test_read_inventory_v1(): f = BytesIO(inventory_v1) @@ -76,3 +85,10 @@ def test_read_inventory_v2(): '/util/glossary.html#term-a-term' assert invdata['std:term']['a term including:colon'][2] == \ '/util/glossary.html#term-a-term-including-colon' + + +def test_read_inventory_v2_not_having_version(): + f = BytesIO(inventory_v2_not_having_version) + invdata = InventoryFile.load(f, '/util', posixpath.join) + assert invdata['py:module']['module1'] == \ + ('foo', '', '/util/foo.html#module-module1', 'Long Module desc') diff --git a/utils/bump_version.py b/utils/bump_version.py index 3f64f6ecf..444eefe07 100755 --- a/utils/bump_version.py +++ b/utils/bump_version.py @@ -2,12 +2,12 @@ from __future__ import print_function +import argparse import os import re import sys -import argparse -from datetime import datetime from contextlib import contextmanager +from datetime import datetime script_dir = os.path.dirname(__file__) package_dir = os.path.abspath(os.path.join(script_dir, '..')) diff --git a/utils/checks.py b/utils/checks.py index 90d89439e..3d421b385 100644 --- a/utils/checks.py +++ b/utils/checks.py @@ -11,6 +11,7 @@ import os import re + import sphinx name_mail_re = r'[\w ]+(<.*?>)?' diff --git a/utils/jssplitter_generator.py b/utils/jssplitter_generator.py index b7273a5c1..684749973 100644 --- a/utils/jssplitter_generator.py +++ b/utils/jssplitter_generator.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -import re import json +import re import subprocess import sys + import six # find char codes they are matched with Python's (?u)\\w