diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py index cd35e789a..d0614718b 100644 --- a/sphinx/ext/doctest.py +++ b/sphinx/ext/doctest.py @@ -15,7 +15,6 @@ import re import sys import time import codecs -import platform from os import path import doctest @@ -144,7 +143,8 @@ class TestDirective(Directive): if self.name == 'doctest' and 'pyversion' in self.options: try: spec = self.options['pyversion'] - if not is_allowed_version(spec, platform.python_version()): + python_version = '.'.join(str(v) for v in sys.version_info[:3]) + if not is_allowed_version(spec, python_version): flag = doctest.OPTIONFLAGS_BY_NAME['SKIP'] node['options'][flag] = True # Skip the test except InvalidSpecifier: diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 5ed39906e..fd13d6fd6 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -453,7 +453,8 @@ class Signature(object): if annotation.__module__ == 'builtins': return annotation.__qualname__ # type: ignore - elif isinstance(annotation, typing.GenericMeta): + elif (hasattr(typing, 'GenericMeta') and # for py36 or below + isinstance(annotation, typing.GenericMeta)): # In Python 3.5.2+, all arguments are stored in __args__, # whereas __parameters__ only contains generic parameters. # @@ -480,7 +481,8 @@ class Signature(object): if params is not None: param_str = ', '.join(self.format_annotation(p) for p in params) return '%s[%s]' % (qualified_name, param_str) - elif (isinstance(annotation, typing.CallableMeta) and # type: ignore + elif (hasattr(typing, 'CallableMeta') and # for py36 or below + isinstance(annotation, typing.CallableMeta) and # type: ignore getattr(annotation, '__args__', None) is not None and hasattr(annotation, '__result__')): # Skipped in the case of plain typing.Callable @@ -495,7 +497,8 @@ class Signature(object): return '%s[%s, %s]' % (qualified_name, args_str, self.format_annotation(annotation.__result__)) - elif (isinstance(annotation, typing.TupleMeta) and # type: ignore + elif (hasattr(typing, 'TupleMeta') and # for py36 or below + isinstance(annotation, typing.TupleMeta) and # type: ignore hasattr(annotation, '__tuple_params__') and hasattr(annotation, '__tuple_use_ellipsis__')): params = annotation.__tuple_params__ diff --git a/tests/test_ext_math.py b/tests/test_ext_math.py index 9bbd6217d..1cdf4d637 100644 --- a/tests/test_ext_math.py +++ b/tests/test_ext_math.py @@ -11,6 +11,7 @@ import os import re +import errno import subprocess import pytest @@ -20,7 +21,7 @@ def has_binary(binary): try: subprocess.check_output([binary]) except OSError as e: - if e.errno == os.errno.ENOENT: + if e.errno == errno.ENOENT: # handle file not found error. return False else: diff --git a/tests/test_util_inspect.py b/tests/test_util_inspect.py index b5d50ed71..136536ec6 100644 --- a/tests/test_util_inspect.py +++ b/tests/test_util_inspect.py @@ -215,7 +215,12 @@ def test_Signature_annotations(): # TypeVars and generic types with TypeVars sig = inspect.Signature(f2).format_args() - assert sig == '(x: List[T], y: List[T_co], z: T) -> List[T_contra]' + if sys.version_info < (3, 7): + sig == ('(x: typing.List[T], y: typing.List[T_co], z: T) -> ' + 'typing.List[T_contra]') + else: + sig == ('(x: typing.List[~T], y: typing.List[+T_co], z: T) -> ' + 'typing.List[-T_contra]') # Union types sig = inspect.Signature(f3).format_args()