Commit 468b8c06 authored by scoder's avatar scoder Committed by GitHub

Merge pull request #1965 from scoder/mypy

Type annotation pyi file and tests (II)
parents 2551df17 53330808
......@@ -147,5 +147,6 @@ script:
- PYTHON_DBG="python$( python -c 'import sys; print("%d.%d" % sys.version_info[:2])' )-dbg"
- if $PYTHON_DBG -V >&2; then CFLAGS="-O0 -ggdb" $PYTHON_DBG runtests.py -vv Debugger --backends=$BACKEND; fi
- if [ "$BACKEND" = "cpp" -a -n "${TRAVIS_PYTHON_VERSION##2.6*}" ]; then pip install pythran; fi
- if [ "$BACKEND" = "c" -a -n "${TRAVIS_PYTHON_VERSION##2*}" ]; then pip install mypy; fi
- CFLAGS="-O2 -ggdb -Wall -Wextra $(python -c 'import sys; print("-fno-strict-aliasing" if sys.version_info[0] == 2 else "")')" python setup.py build_ext -i
- CFLAGS="-O0 -ggdb -Wall -Wextra" python runtests.py -vv -x Debugger --backends=$BACKEND -j7
from builtins import (int as py_int, float as py_float,
bool as py_bool, str as py_str, complex as py_complex)
from typing import (Union, Dict, Any, Sequence, Optional,
List, TypeVar, Type, Generic)
int = py_int
long = py_int
longlong = py_int
short = py_int
char = py_int
sint = py_int
slong = py_int
slonglong = py_int
sshort = py_int
schar = py_int
uint = py_int
ulong = py_int
ulonglong = py_int
ushort = py_int
uchar = py_int
size_t = py_int
Py_ssize_t = py_int
Py_UCS4 = Union[py_int, str]
Py_UNICODE = Union[py_int, str]
float = py_float
double = py_float
longdouble = py_float
complex = py_complex
floatcomplex = py_complex
doublecomplex = py_complex
longdoublecomplex = py_complex
bint = py_bool
void = Union[None]
basestring = py_str
unicode = py_str
gs: Dict[str, Any] # Should match the return type of globals()
_T = TypeVar('_T')
class _ArrayType(object, Generic[_T]):
is_array: bool
subtypes: Sequence[str]
dtype: _T
ndim: int
is_c_contig: bool
is_f_contig: bool
inner_contig: bool
broadcasting: Any
# broadcasting is not used, so it's not clear about its type
def __init__(self, dtype: _T, ndim: int, is_c_contig: bool = ...,
is_f_contig: bool = ..., inner_contig: bool = ...,
broadcasting: Any = ...) -> None: ...
def __repr__(self) -> str: ...
class CythonTypeObject(object):
...
class CythonType(CythonTypeObject):
...
class PointerType(CythonType, Generic[_T]):
def __init__(
self,
value: Optional[Union[ArrayType[_T], PointerType[_T], List[_T], int]] = ...
) -> None: ...
def __getitem__(self, ix: int) -> _T: ...
def __setitem__(self, ix: int, value: _T) -> None: ...
def __eq__(self, value: object) -> bool: ...
def __repr__(self) -> str: ...
class ArrayType(PointerType[_T]):
def __init__(self) -> None: ...
#class StructType(CythonType, Generic[_T]):
# def __init__(
# self,
# value: List[Type[_T]] = ...
# ) -> None: ...
def index_type(
base_type: _T, item: Union[tuple, slice, int]) -> _ArrayType[_T]: ...
def pointer(basetype: _T) -> Type[PointerType[_T]]: ...
def array(basetype: _T, n: int) -> Type[ArrayType[_T]]: ...
#def struct(basetype: _T) -> Type[StructType[_T]]: ...
class typedef(CythonType, Generic[_T]):
name: str
def __init__(self, type: _T, name: Optional[str] = ...) -> None: ...
def __call__(self, *arg: Any) -> _T: ...
def __repr__(self) -> str: ...
__getitem__ = index_type
#class _FusedType(CythonType, Generic[_T]):
# def __init__(self) -> None: ...
#def fused_type(*args: Tuple[_T]) -> Type[FusedType[_T]]: ...
......@@ -652,7 +652,7 @@ class TestBuilder(object):
if pyver
]
if not min_py_ver or any(sys.version_info >= min_ver for min_ver in min_py_ver):
suite.addTest(PureDoctestTestCase(module, os.path.join(path, filename)))
suite.addTest(PureDoctestTestCase(module, os.path.join(path, filename), tags))
return suite
......@@ -1259,7 +1259,8 @@ def run_forked_test(result, run_func, test_name, fork=True):
pass
class PureDoctestTestCase(unittest.TestCase):
def __init__(self, module_name, module_path):
def __init__(self, module_name, module_path, tags):
self.tags = tags
self.module_name = module_name
self.module_path = module_path
unittest.TestCase.__init__(self, 'run')
......@@ -1292,6 +1293,24 @@ class PureDoctestTestCase(unittest.TestCase):
except Exception:
pass
try:
from mypy import api as mypy_api
nomypy = False
except ImportError:
nomypy = True
if 'mypy' in self.tags['tag'] and not nomypy:
mypy_result = mypy_api.run((
self.module_path,
'--ignore-missing-imports',
'--follow-imports', 'skip',
))
if mypy_result[2]:
import pdb; pdb.set_trace()
self.fail(mypy_result[0])
is_private_field = re.compile('^_[^_]').match
class _FakeClass(object):
......
# mode: run
# tag: annotation_typing, pure3.0
# tag: annotation_typing, pure3.0, mypy
import cython
......@@ -7,7 +7,7 @@ is_compiled = cython.compiled
MyUnion = cython.union(n=cython.int, x=cython.double)
MyStruct = cython.struct(is_integral=cython.bint, data=MyUnion)
MyStruct2 = cython.typedef(MyStruct[2])
MyStruct2 = cython.typedef(MyStruct[2]) # type: cython.StructType
@cython.ccall # cpdef => C return type
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment