diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2018-09-08 11:38:39 +0900 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2018-09-22 16:31:07 +0900 |
commit | b18fe13f550e58cd9b65246ceda8618a760b84c8 (patch) | |
tree | 2a922a706543c092f31e6cc3019edc1a15c92137 | |
parent | 271ea125f2e5c3c21b39e5fa6edfc4b6dbcf0d26 (diff) | |
download | sphinx-git-b18fe13f550e58cd9b65246ceda8618a760b84c8.tar.gz |
Drop branches for sys.version_info < (3, 4)
-rw-r--r-- | sphinx/environment/__init__.py | 4 | ||||
-rw-r--r-- | sphinx/ext/autodoc/importer.py | 6 | ||||
-rw-r--r-- | sphinx/ext/napoleon/__init__.py | 46 | ||||
-rw-r--r-- | sphinx/util/__init__.py | 3 | ||||
-rw-r--r-- | sphinx/util/inspect.py | 104 | ||||
-rw-r--r-- | tests/conftest.py | 8 | ||||
-rw-r--r-- | tests/py35/test_autodoc_py35.py | 22 | ||||
-rw-r--r-- | tests/test_autodoc.py | 2 | ||||
-rw-r--r-- | tests/test_build.py | 5 | ||||
-rw-r--r-- | tests/test_docutilsconf.py | 4 | ||||
-rw-r--r-- | tests/test_util_inspect.py | 34 |
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 |