summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2018-09-08 11:38:39 +0900
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2018-09-22 16:31:07 +0900
commitb18fe13f550e58cd9b65246ceda8618a760b84c8 (patch)
tree2a922a706543c092f31e6cc3019edc1a15c92137
parent271ea125f2e5c3c21b39e5fa6edfc4b6dbcf0d26 (diff)
downloadsphinx-git-b18fe13f550e58cd9b65246ceda8618a760b84c8.tar.gz
Drop branches for sys.version_info < (3, 4)
-rw-r--r--sphinx/environment/__init__.py4
-rw-r--r--sphinx/ext/autodoc/importer.py6
-rw-r--r--sphinx/ext/napoleon/__init__.py46
-rw-r--r--sphinx/util/__init__.py3
-rw-r--r--sphinx/util/inspect.py104
-rw-r--r--tests/conftest.py8
-rw-r--r--tests/py35/test_autodoc_py35.py22
-rw-r--r--tests/test_autodoc.py2
-rw-r--r--tests/test_build.py5
-rw-r--r--tests/test_docutilsconf.py4
-rw-r--r--tests/test_util_inspect.py34
11 files changed, 33 insertions, 205 deletions
diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py
index 4f91e2f8e..63631302f 100644
--- a/sphinx/environment/__init__.py
+++ b/sphinx/environment/__init__.py
@@ -62,9 +62,7 @@ default_settings = {
# This is increased every time an environment attribute is added
# or changed to properly invalidate pickle files.
-#
-# NOTE: increase base version by 2 to have distinct numbers for Py2 and 3
-ENV_VERSION = 54 + (sys.version_info[0] - 2)
+ENV_VERSION = 56
# config status
CONFIG_OK = 1
diff --git a/sphinx/ext/autodoc/importer.py b/sphinx/ext/autodoc/importer.py
index a2280e82b..c75ac04ae 100644
--- a/sphinx/ext/autodoc/importer.py
+++ b/sphinx/ext/autodoc/importer.py
@@ -234,12 +234,6 @@ def get_object_members(subject, objpath, attrgetter, analyzer=None):
# the members directly defined in the class
obj_dict = attrgetter(subject, '__dict__', {})
- # Py34 doesn't have enum members in __dict__.
- if sys.version_info[:2] == (3, 4) and isenumclass(subject):
- obj_dict = dict(obj_dict)
- for name, value in subject.__members__.items():
- obj_dict[name] = value
-
members = {} # type: Dict[str, Attribute]
# enum members
diff --git a/sphinx/ext/napoleon/__init__.py b/sphinx/ext/napoleon/__init__.py
index b968f5948..c51ea2522 100644
--- a/sphinx/ext/napoleon/__init__.py
+++ b/sphinx/ext/napoleon/__init__.py
@@ -9,9 +9,7 @@
:license: BSD, see LICENSE for details.
"""
-import sys
-
-from six import PY2, iteritems
+from six import iteritems
import sphinx
from sphinx.application import Sphinx
@@ -435,34 +433,26 @@ def _skip_member(app, what, name, obj, skip, options):
if name != '__weakref__' and has_doc and is_member:
cls_is_owner = False
if what == 'class' or what == 'exception':
- if PY2:
- cls = getattr(obj, 'im_class', getattr(obj, '__objclass__',
- None))
- cls_is_owner = (cls and hasattr(cls, name) and
- name in cls.__dict__)
- elif sys.version_info >= (3, 3):
- qualname = getattr(obj, '__qualname__', '')
- cls_path, _, _ = qualname.rpartition('.')
- if cls_path:
- try:
- if '.' in cls_path:
- import importlib
- import functools
-
- mod = importlib.import_module(obj.__module__)
- mod_path = cls_path.split('.')
- cls = functools.reduce(getattr, mod_path, mod)
- else:
- cls = obj.__globals__[cls_path]
- except Exception:
- cls_is_owner = False
+ qualname = getattr(obj, '__qualname__', '')
+ cls_path, _, _ = qualname.rpartition('.')
+ if cls_path:
+ try:
+ if '.' in cls_path:
+ import importlib
+ import functools
+
+ mod = importlib.import_module(obj.__module__)
+ mod_path = cls_path.split('.')
+ cls = functools.reduce(getattr, mod_path, mod)
else:
- cls_is_owner = (cls and hasattr(cls, name) and
- name in cls.__dict__)
- else:
+ cls = obj.__globals__[cls_path]
+ except Exception:
cls_is_owner = False
+ else:
+ cls_is_owner = (cls and hasattr(cls, name) and # type: ignore
+ name in cls.__dict__)
else:
- cls_is_owner = True
+ cls_is_owner = False
if what == 'module' or cls_is_owner:
is_init = (name == '__init__')
diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py
index 2da685a97..951eb71ff 100644
--- a/sphinx/util/__init__.py
+++ b/sphinx/util/__init__.py
@@ -677,8 +677,7 @@ def xmlname_checker():
[u'\u2C00', u'\u2FEF'], [u'\u3001', u'\uD7FF'], [u'\uF900', u'\uFDCF'],
[u'\uFDF0', u'\uFFFD']]
- if sys.version_info.major == 3:
- name_start_chars.append([u'\U00010000', u'\U000EFFFF'])
+ name_start_chars.append([u'\U00010000', u'\U000EFFFF'])
name_chars = [
u"\\-", u"\\.", [u'0', u'9'], u'\u00B7', [u'\u0300', u'\u036F'],
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py
index 3f5c98eb1..357897232 100644
--- a/sphinx/util/inspect.py
+++ b/sphinx/util/inspect.py
@@ -648,108 +648,6 @@ class Signature(object):
return qualname
-if sys.version_info >= (3, 5):
- _getdoc = inspect.getdoc
-else:
- # code copied from the inspect.py module of the standard library
- # of Python 3.5
-
- def _findclass(func):
- # type: (Any) -> Any
- cls = sys.modules.get(func.__module__)
- if cls is None:
- return None
- if hasattr(func, 'im_class'):
- cls = func.im_class
- else:
- for name in func.__qualname__.split('.')[:-1]:
- cls = getattr(cls, name)
- if not inspect.isclass(cls):
- return None
- return cls
-
- def _finddoc(obj):
- # type: (Any) -> unicode
- if inspect.isclass(obj):
- for base in obj.__mro__:
- if base is not object:
- try:
- doc = base.__doc__
- except AttributeError:
- continue
- if doc is not None:
- return doc
- return None
-
- if inspect.ismethod(obj) and getattr(obj, '__self__', None):
- name = obj.__func__.__name__
- self = obj.__self__
- if (inspect.isclass(self) and
- getattr(getattr(self, name, None), '__func__')
- is obj.__func__):
- # classmethod
- cls = self
- else:
- cls = self.__class__
- elif inspect.isfunction(obj) or inspect.ismethod(obj):
- name = obj.__name__
- cls = _findclass(obj)
- if cls is None or getattr(cls, name) != obj:
- return None
- elif inspect.isbuiltin(obj):
- name = obj.__name__
- self = obj.__self__
- if (inspect.isclass(self) and
- self.__qualname__ + '.' + name == obj.__qualname__):
- # classmethod
- cls = self
- else:
- cls = self.__class__
- # Should be tested before isdatadescriptor().
- elif isinstance(obj, property):
- func = obj.fget
- name = func.__name__
- cls = _findclass(func)
- if cls is None or getattr(cls, name) is not obj:
- return None
- elif inspect.ismethoddescriptor(obj) or inspect.isdatadescriptor(obj):
- name = obj.__name__
- cls = obj.__objclass__
- if getattr(cls, name) is not obj:
- return None
- else:
- return None
-
- for base in cls.__mro__:
- try:
- doc = getattr(base, name).__doc__
- except AttributeError:
- continue
- if doc is not None:
- return doc
- return None
-
- def _getdoc(object):
- # type: (Any) -> unicode
- """Get the documentation string for an object.
-
- All tabs are expanded to spaces. To clean up docstrings that are
- indented to line up with blocks of code, any whitespace than can be
- uniformly removed from the second line onwards is removed."""
- try:
- doc = object.__doc__
- except AttributeError:
- return None
- if doc is None:
- try:
- doc = _finddoc(object)
- except (AttributeError, TypeError):
- return None
- if not isinstance(doc, str):
- return None
- return inspect.cleandoc(doc)
-
-
def getdoc(obj, attrgetter=safe_getattr, allow_inherited=False):
# type: (Any, Callable, bool) -> unicode
"""Get the docstring for the object.
@@ -763,6 +661,6 @@ def getdoc(obj, attrgetter=safe_getattr, allow_inherited=False):
if ispartial(obj) and doc == obj.__class__.__doc__:
return getdoc(obj.func)
elif doc is None and allow_inherited:
- doc = _getdoc(obj)
+ doc = inspect.getdoc(obj)
return doc
diff --git a/tests/conftest.py b/tests/conftest.py
index 9f46b1868..65142d84a 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -9,7 +9,6 @@
import os
import shutil
-import sys
import docutils
import pytest
@@ -22,13 +21,6 @@ pytest_plugins = 'sphinx.testing.fixtures'
# Exclude 'roots' dirs for pytest test collector
collect_ignore = ['roots']
-# Disable Python version-specific
-if sys.version_info < (3,):
- collect_ignore += ['py3']
-
-if sys.version_info < (3, 5):
- collect_ignore += ['py35']
-
@pytest.fixture(scope='session')
def rootdir():
diff --git a/tests/py35/test_autodoc_py35.py b/tests/py35/test_autodoc_py35.py
index 5064970e6..dcaf665af 100644
--- a/tests/py35/test_autodoc_py35.py
+++ b/tests/py35/test_autodoc_py35.py
@@ -10,11 +10,7 @@
:license: BSD, see LICENSE for details.
"""
-# "raises" imported for usage by autodoc
-import sys
-
import pytest
-import six
from docutils.statemachine import ViewList
from six import StringIO
@@ -207,11 +203,8 @@ def test_generate():
('attribute', 'test_autodoc_py35.Class.inst_attr_inline'),
('attribute', 'test_autodoc_py35.Class.inst_attr_string'),
('method', 'test_autodoc_py35.Class.moore'),
+ ('method', 'test_autodoc_py35.Class.do_coroutine'),
])
- if six.PY3 and sys.version_info[:2] >= (3, 5):
- should.extend([
- ('method', 'test_autodoc_py35.Class.do_coroutine'),
- ])
options.members = ALL
assert_processes(should, 'class', 'Class')
options.undoc_members = True
@@ -280,9 +273,8 @@ class Base(object):
"""Inherited function."""
-if six.PY3 and sys.version_info[:2] >= (3, 5):
- async def _other_coro_func():
- return "run"
+async def _other_coro_func():
+ return "run"
class Class(Base):
@@ -341,8 +333,6 @@ class Class(Base):
# undocumented special method
pass
- if six.PY3 and sys.version_info[:2] >= (3, 5):
-
- async def do_coroutine(self):
- """A documented coroutine function"""
- attr_coro_result = await _other_coro_func() # NOQA
+ async def do_coroutine(self):
+ """A documented coroutine function"""
+ attr_coro_result = await _other_coro_func() # NOQA
diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py
index c9ca57350..0450c4c4a 100644
--- a/tests/test_autodoc.py
+++ b/tests/test_autodoc.py
@@ -1426,8 +1426,6 @@ def test_partialfunction():
assert call_autodoc('module', 'target.partialfunction') == expected
-@pytest.mark.skipif(sys.version_info < (3, 4),
- reason='functools.partialmethod is available on py34 or above')
@pytest.mark.sphinx('html', testroot='ext-autodoc')
def test_partialmethod(app):
expected = [
diff --git a/tests/test_build.py b/tests/test_build.py
index 47d76b2a2..e608797b9 100644
--- a/tests/test_build.py
+++ b/tests/test_build.py
@@ -33,11 +33,6 @@ def nonascii_srcdir(request, rootdir, sphinx_test_tempdir):
# If supported, build in a non-ASCII source dir
test_name = u'\u65e5\u672c\u8a9e'
basedir = sphinx_test_tempdir / request.node.originalname
- # Windows with versions prior to 3.2 (I think) doesn't support unicode on system path
- # so we force a non-unicode path in that case
- if (sys.platform == "win32" and
- not (sys.version_info.major >= 3 and sys.version_info.minor >= 2)):
- return basedir / 'all'
try:
srcdir = basedir / test_name
if not srcdir.exists():
diff --git a/tests/test_docutilsconf.py b/tests/test_docutilsconf.py
index 989edc6a8..32a2aad29 100644
--- a/tests/test_docutilsconf.py
+++ b/tests/test_docutilsconf.py
@@ -10,7 +10,6 @@
"""
import re
-import sys
import pytest
@@ -82,9 +81,6 @@ def test_texinfo(app, status, warning):
@pytest.mark.sphinx('html', testroot='docutilsconf',
docutilsconf='[general]\nsource_link=true\n')
-@pytest.mark.skip(sys.platform == "win32" and
- not (sys.version_info.major >= 3 and sys.version_info.minor >= 2),
- reason="Python < 3.2 on Win32 doesn't handle non-ASCII paths right")
def test_docutils_source_link_with_nonascii_file(app, status, warning):
srcdir = path(app.srcdir)
mb_name = u'\u65e5\u672c\u8a9e'
diff --git a/tests/test_util_inspect.py b/tests/test_util_inspect.py
index 7266d4bbf..74864f41a 100644
--- a/tests/test_util_inspect.py
+++ b/tests/test_util_inspect.py
@@ -105,13 +105,8 @@ def test_getargspec_bound_methods():
pass
assert expected_unbound == inspect.getargspec(Foo.method)
- if PY3 and sys.version_info >= (3, 4, 4):
- # On py2, the inspect functions don't properly handle bound
- # methods (they include a spurious 'self' argument)
- assert expected_bound == inspect.getargspec(bound_method)
- # On py2, the inspect functions can't properly handle wrapped
- # functions (no __wrapped__ support)
- assert expected_bound == inspect.getargspec(wrapped_bound_method)
+ assert expected_bound == inspect.getargspec(bound_method)
+ assert expected_bound == inspect.getargspec(wrapped_bound_method)
def test_Signature():
@@ -143,10 +138,7 @@ def test_Signature_partial():
p = functools.partial(fun, 10, c=11)
sig = inspect.Signature(p).format_args()
- if sys.version_info < (3,):
- assert sig == '(b, d=2)'
- else:
- assert sig == '(b, *, c=11, d=2)'
+ assert sig == '(b, *, c=11, d=2)'
def test_Signature_methods():
@@ -193,16 +185,9 @@ def test_Signature_methods():
# wrapped bound method
sig = inspect.Signature(wrapped_bound_method).format_args()
- if sys.version_info < (3,):
- assert sig == '(*args, **kwargs)'
- elif sys.version_info < (3, 4, 4):
- assert sig == '(self, arg1, **kwargs)'
- else:
- assert sig == '(arg1, **kwargs)'
+ assert sig == '(arg1, **kwargs)'
-@pytest.mark.skipif(sys.version_info < (3, 4),
- reason='functools.partialmethod is available on py34 or above')
def test_Signature_partialmethod():
from functools import partialmethod
@@ -228,8 +213,6 @@ def test_Signature_partialmethod():
assert sig == '()'
-@pytest.mark.skipif(sys.version_info < (3, 4),
- reason='type annotation test is available on py34 or above')
def test_Signature_annotations():
from typing_test_data import (
f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, Node)
@@ -437,10 +420,5 @@ def test_isstaticmethod():
assert inspect.isstaticmethod(Foo.method1, Foo, 'method1') is True
assert inspect.isstaticmethod(Foo.method2, Foo, 'method2') is False
-
- if sys.version_info < (3, 0):
- assert inspect.isstaticmethod(Bar.method1, Bar, 'method1') is False
- assert inspect.isstaticmethod(Bar.method2, Bar, 'method2') is False
- else:
- assert inspect.isstaticmethod(Bar.method1, Bar, 'method1') is True
- assert inspect.isstaticmethod(Bar.method2, Bar, 'method2') is False
+ assert inspect.isstaticmethod(Bar.method1, Bar, 'method1') is True
+ assert inspect.isstaticmethod(Bar.method2, Bar, 'method2') is False