diff --git a/CHANGES b/CHANGES index 153dec87d..cdf469ed5 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,7 @@ Deprecated * The ``suffix`` argument of ``env.doc2path()`` is deprecated. * The string style ``base`` argument of ``env.doc2path()`` is deprecated. * ``sphinx.application.Sphinx._setting_up_extension`` +* ``sphinx.ext.config.check_unicode()`` * ``sphinx.ext.doctest.doctest_encode()`` * ``sphinx.testing.util.remove_unicode_literal()`` * ``sphinx.util.get_matching_docs()`` is deprecated diff --git a/doc/extdev/index.rst b/doc/extdev/index.rst index f6c813b0d..d16d792d4 100644 --- a/doc/extdev/index.rst +++ b/doc/extdev/index.rst @@ -133,6 +133,11 @@ The following is a list of deprecated interfaces. - 4.0 - ``os.path.join()`` + * - ``sphinx.ext.config.check_unicode()`` + - 2.0 + - 4.0 + - N/A + * - ``sphinx.ext.doctest.doctest_encode()`` - 2.0 - 4.0 diff --git a/sphinx/application.py b/sphinx/application.py index 071d0cb33..bec79b7ff 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -25,7 +25,7 @@ from docutils.parsers.rst import Directive, directives, roles import sphinx from sphinx import package_dir, locale -from sphinx.config import Config, check_unicode +from sphinx.config import Config from sphinx.config import CONFIG_FILENAME # NOQA # for compatibility (RemovedInSphinx30) from sphinx.deprecation import ( RemovedInSphinx30Warning, RemovedInSphinx40Warning @@ -200,7 +200,6 @@ class Sphinx: self.config = Config({}, confoverrides or {}) else: self.config = Config.read(self.confdir, confoverrides or {}, self.tags) - check_unicode(self.config) # initialize some limited config variables before initialize i18n and loading # extensions diff --git a/sphinx/cmd/build.py b/sphinx/cmd/build.py index 35176c7fc..fe167413a 100644 --- a/sphinx/cmd/build.py +++ b/sphinx/cmd/build.py @@ -18,7 +18,7 @@ import sys import traceback from docutils.utils import SystemMessage -from six import text_type, binary_type +from six import text_type import sphinx.locale from sphinx import __display_version__, package_dir @@ -230,13 +230,6 @@ def build_main(argv=sys.argv[1:]): # type: ignore if missing_files: parser.error(__('cannot find files %r') % missing_files) - # likely encoding used for command-line arguments - try: - locale = __import__('locale') # due to submodule of the same name - likely_encoding = locale.getpreferredencoding() - except Exception: - likely_encoding = None - if args.force_all and filenames: parser.error(__('cannot combine -a option and filenames')) @@ -268,11 +261,6 @@ def build_main(argv=sys.argv[1:]): # type: ignore key, val = val.split('=', 1) except ValueError: parser.error(__('-D option argument must be in the form name=value')) - if likely_encoding and isinstance(val, binary_type): - try: - val = val.decode(likely_encoding) - except UnicodeError: - pass confoverrides[key] = val for val in args.htmldefine: @@ -283,11 +271,7 @@ def build_main(argv=sys.argv[1:]): # type: ignore try: val = int(val) except ValueError: - if likely_encoding and isinstance(val, binary_type): - try: - val = val.decode(likely_encoding) - except UnicodeError: - pass + pass confoverrides['html_context.%s' % key] = val if args.nitpicky: diff --git a/sphinx/cmd/quickstart.py b/sphinx/cmd/quickstart.py index 94f829e13..934f47b2a 100644 --- a/sphinx/cmd/quickstart.py +++ b/sphinx/cmd/quickstart.py @@ -35,7 +35,7 @@ except ImportError: USE_LIBEDIT = False from docutils.utils import column_width -from six import text_type, binary_type +from six import text_type import sphinx.locale from sphinx import __display_version__, package_dir @@ -644,11 +644,6 @@ def main(argv=sys.argv[1:]): print('[Interrupted.]') return 130 # 128 + SIGINT - # decode values in d if value is a Python string literal - for key, value in d.items(): - if isinstance(value, binary_type): - d[key] = term_decode(value) - # handle use of CSV-style extension values d.setdefault('extensions', []) for ext in d['extensions'][:]: diff --git a/sphinx/config.py b/sphinx/config.py index 45ba9f7d9..f5a7106d7 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -17,9 +17,9 @@ from collections import OrderedDict from os import path, getenv from typing import Any, NamedTuple, Union -from six import string_types, binary_type, text_type, integer_types +from six import string_types, text_type, integer_types -from sphinx.deprecation import RemovedInSphinx30Warning +from sphinx.deprecation import RemovedInSphinx30Warning, RemovedInSphinx40Warning from sphinx.errors import ConfigError, ExtensionError from sphinx.locale import _, __ from sphinx.util import logging @@ -488,10 +488,13 @@ def check_unicode(config): """check all string values for non-ASCII characters in bytestrings, since that can result in UnicodeErrors all over the place """ + warnings.warn('sphinx.config.check_unicode() is deprecated.', + RemovedInSphinx40Warning) + nonascii_re = re.compile(br'[\x80-\xff]') for name, value in config._raw_config.items(): - if isinstance(value, binary_type) and nonascii_re.search(value): + if isinstance(value, bytes) and nonascii_re.search(value): logger.warning(__('the config value %r is set to a string with non-ASCII ' 'characters; this can lead to Unicode errors occurring. ' 'Please use Unicode strings, e.g. %r.'), name, u'Content') diff --git a/sphinx/ext/apidoc.py b/sphinx/ext/apidoc.py index 31cdb5855..36073298f 100644 --- a/sphinx/ext/apidoc.py +++ b/sphinx/ext/apidoc.py @@ -25,8 +25,6 @@ import sys from fnmatch import fnmatch from os import path -from six import binary_type - import sphinx.locale from sphinx import __display_version__, package_dir from sphinx.cmd.quickstart import EXTENSIONS @@ -444,15 +442,6 @@ def main(argv=sys.argv[1:]): if args.extensions: d['extensions'].extend(args.extensions) - if isinstance(args.header, binary_type): - d['project'] = d['project'].decode('utf-8') - if isinstance(args.author, binary_type): - d['author'] = d['author'].decode('utf-8') - if isinstance(args.version, binary_type): - d['version'] = d['version'].decode('utf-8') - if isinstance(args.release, binary_type): - d['release'] = d['release'].decode('utf-8') - if not args.dryrun: qs.generate(d, silent=True, overwrite=args.force) elif args.tocfile: diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py index b2244d032..0f706ae87 100644 --- a/sphinx/ext/doctest.py +++ b/sphinx/ext/doctest.py @@ -22,13 +22,13 @@ from docutils import nodes from docutils.parsers.rst import directives from packaging.specifiers import SpecifierSet, InvalidSpecifier from packaging.version import Version -from six import StringIO, binary_type +from six import StringIO import sphinx from sphinx.builders import Builder from sphinx.deprecation import RemovedInSphinx40Warning from sphinx.locale import __ -from sphinx.util import force_decode, logging +from sphinx.util import logging from sphinx.util.console import bold # type: ignore from sphinx.util.docutils import SphinxDirective from sphinx.util.nodes import set_source_info @@ -330,8 +330,6 @@ class DocTestBuilder(Builder): logger.warning(text) else: logger.info(text, nonl=True) - if isinstance(text, binary_type): - text = force_decode(text, None) self.outfile.write(text) def get_target_uri(self, docname, typ=None): diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 82218e335..e11ae1855 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -28,7 +28,7 @@ from time import mktime, strptime from urllib.parse import urlsplit, urlunsplit, quote_plus, parse_qsl, urlencode from docutils.utils import relative_path -from six import text_type, binary_type +from six import text_type from sphinx.deprecation import RemovedInSphinx30Warning, RemovedInSphinx40Warning from sphinx.errors import PycodeError, SphinxParallelError, ExtensionError @@ -458,7 +458,7 @@ def parselinenos(spec, total): def force_decode(string, encoding): # type: (unicode, unicode) -> unicode """Forcibly get a unicode string out of a bytestring.""" - if isinstance(string, binary_type): + if isinstance(string, bytes): try: if encoding: string = string.decode(encoding) diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 82814e00d..885a7b929 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -18,9 +18,8 @@ import sys import typing from functools import partial -from six import StringIO, binary_type, string_types +from six import StringIO, string_types -from sphinx.util import force_decode from sphinx.util import logging from sphinx.util.pycompat import NoneType @@ -249,8 +248,6 @@ def object_description(object): s = repr(object) except Exception: raise ValueError - if isinstance(s, binary_type): - s = force_decode(s, None) # type: ignore # Strip non-deterministic memory addresses such as # ``<__main__.A at 0x7f68cb685710>`` s = memory_address_re.sub('', s)